使用CRYPTO_thread_setup的多个SSL环境

时间:2015-01-05 10:13:10

标签: c++ multithreading openssl

我有多个SSL服务器在不同的线程中运行,我在openssl c ++中定义锁定方法时遇到了麻烦?我应该为整个应用程序定义一个锁定/清理方法,还是为每个线程定义多个?

2 个答案:

答案 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);
    }

请注意,应用程序中使用了一组锁。