我有多个SSL服务器在不同的线程中运行,我在openssl c ++中定义锁定方法时遇到了麻烦?我应该为整个应用程序定义一个锁定/清理方法,还是为每个线程定义多个?
答案 0 :(得分:1)
初始化库一次在主应用程序线程中,就像这里:https://github.com/openssl/openssl/blob/master/crypto/threads/mttest.c#L331或样本中的相同内容:https://github.com/openssl/openssl/tree/master/crypto/threads
答案 1 :(得分:1)
我应该为整个应用程序定义一个锁定/清理方法,还是为每个线程定义多个?
OpenSSL 不使用线程本地存储。所以你应该不尝试在每个线程的基础上安装锁。
您应该在应用程序范围内提供锁。
以下是相关来源。
$ grep -R CRYPTO_thread_setup *
crypto/threads/th-lock.c: * CRYPTO_thread_setup();
crypto/threads/th-lock.c:void CRYPTO_thread_setup(void)
...
以下是设置的一个示例(其中有一些适用于不同的平台):
static HANDLE *lock_cs;
...
void CRYPTO_thread_setup(void)
{
int i;
lock_cs=OPENSSL_malloc(CRYPTO_num_locks() * sizeof(HANDLE));
for (i=0; i<CRYPTO_num_locks(); i++)
{
lock_cs[i]=CreateMutex(NULL,FALSE,NULL);
}
CRYPTO_set_locking_callback((void (*)(int,int,char *,int))win32_locking_callback);
/* id callback defined */
return(1);
}
请注意,应用程序中使用了一组锁。