He estado llamando al reading sobre el requisito de que si se usa OpenSSL en una aplicación de subprocesos múltiples, debe registrar una función de identificación de subprocesos (y también una función de creación de mutex) con OpenSSL.OpenSSL y multi-threads
En Linux, de acuerdo con el ejemplo proporcionado por OpenSSL, un hilo normalmente se identifica mediante el registro de una función como esta:
static unsigned long id_function(void){
return (unsigned long)pthread_self();
}
pthread_self() devuelve una pthread_t, y esto funciona en Linux desde pthread_t es sólo un typedef de unsigned long.
En pthreads Windows, FreeBSD y otros sistemas operativos, pthread_t es una estructura, con la siguiente estructura:
struct {
void * p; /* Pointer to actual object */
unsigned int x; /* Extra information - reuse count etc */
}
Esto no se puede simplemente arrojado a un largo sin signo, y cuando intento hacer por lo tanto, arroja un error de compilación. Intenté tomar el vacío * p y convertirlo en un tiempo sin signo, con la teoría de que el puntero de memoria debería ser coherente y único en todos los hilos, pero esto solo hace que mi programa se bloquee mucho.
¿Qué puedo registrar con OpenSSL como la función de identificación de subprocesos cuando uso Windows pthreads o FreeBSD o cualquiera de los otros sistemas operativos como este?
También, como una cuestión adicional:
¿alguien sabe si esto también necesita ser hecho si se compila en OpenSSL y utilizar con QT, y si es así cómo registrarse QThreads con OpenSSL? Sorprendentemente, parece que no puedo encontrar la respuesta en la documentación de QT.
Bueno, parece que OpenSSL es un pedazo de @ # $% entonces. Si escribo una aplicación (de un solo subproceso) que utiliza OpenSSL para alguna tarea, y alguien escribe una biblioteca (dll) que usa (incidentalmente) OpenSSL para alguna otra tarea: ¿cómo diablos se supone que estos dos componentes completamente independientes saben de los demás? existencia, hasta el punto de que uno de ellos (a pesar de ser de un solo subproceso) necesita proporcionar esta funcionalidad de subprocesamiento. –