【发布时间】:2011-03-25 23:11:48
【问题描述】:
我一直reading 要求,如果在多线程应用程序中使用 OpenSSL,您必须向 OpenSSL 注册线程标识函数(以及互斥体创建函数)。
在Linux上,根据OpenSSL提供的例子,线程通常通过注册这样的函数来识别:
static unsigned long id_function(void){
return (unsigned long)pthread_self();
}
pthread_self() 返回一个 pthread_t,这适用于 Linux,因为 pthread_t 只是 unsigned long 的 typedef。
在 Windows pthreads、FreeBSD 和其他操作系统上,pthread_t 是一个结构体,具有以下结构:
struct {
void * p; /* Pointer to actual object */
unsigned int x; /* Extra information - reuse count etc */
}
这不能简单地转换为无符号长整数,当我尝试这样做时,它会引发编译错误。我尝试将 void *p 转换为无符号长整数,理论上内存指针应该在线程之间保持一致和唯一,但这只会导致我的程序崩溃很多。
在使用 Windows pthreads 或 FreeBSD 或任何其他类似这样的操作系统时,我可以向 OpenSSL 注册什么作为线程识别功能?
另外,作为一个附加问题:
有谁知道如果 OpenSSL 被编译成 QT 并与 QT 一起使用,是否也需要这样做,如果需要,如何向 OpenSSL 注册 QThreads?令人惊讶的是,我似乎无法在 QT 的文档中找到答案。
【问题讨论】:
标签: windows multithreading qt pthreads openssl