Я читал о требовании, что если OpenSSL используется в многопоточном приложении, вы должны зарегистрировать функцию идентификации потока (а также функцию создания мьютекса) в OpenSSL.
В Linux, согласно примеру, предоставленному OpenSSL, поток обычно идентифицируется путем регистрации функции, подобной этой:
static unsigned long id_function(void){
return (unsigned long)pthread_self();
}
pthread_self () возвращает pthread_t, и это работает в Linux, так как pthread_t - это просто определение типа unsigned long.
В Windows pthreads, FreeBSD и других операционных системах pthread_t является структурой со следующей структурой:
struct {
void * p; /* Pointer to actual object */
unsigned int x; /* Extra information - reuse count etc */
}
Это не может быть просто приведено к unsigned long, и когда я пытаюсь это сделать, выдается ошибка компиляции. Я пытался взять void * p и привести его к unsigned long, полагая, что указатель памяти должен быть непротиворечивым и уникальным в разных потоках, но это просто приводит к серьезному аварийному завершению моей программы.
Что я могу зарегистрировать в OpenSSL в качестве функции идентификации потока при использовании Windows pthreads или FreeBSD или любой другой операционной системы, подобной этой?
Также в качестве дополнительного вопроса:
Кто-нибудь знает, нужно ли это делать, если OpenSSL скомпилирован и используется с QT, и если да, как зарегистрировать QThreads с OpenSSL? Удивительно, но я не могу найти ответ в документации QT .