Multithreaded OpenSSL

Multithreaded OpenSSL

本文关键字:OpenSSL Multithreaded      更新时间:2023-10-16

我在多线程程序中使用libcurl和OpenSSL。基于Daniel Stenberg的善意回应和的例子

  • opensslthreadlock.c

  • 线程ssl.c

我尝试了以下代码:

static std::mutex* aMutex;
void locking_function(int mode, int n, const char* file, int line)
{
    if(mode & CRYPTO_LOCK){
        std::cout << "Mutex lockingn";
        aMutex[n].lock();
    }
    else{
        std::cout << "Mutex unlockingn";
        aMutex[n].unlock();
    }
}
unsigned long id_function()
{
    return (unsigned long)std::hash<std::thread::id>()   (std::this_thread::get_id());
}
int thread_setup()
{
    aMutex = new std::mutex[CRYPTO_num_locks()];
    if(!aMutex)
        return 0;
    else{
        CRYPTO_set_id_callback(id_function);
        CRYPTO_set_locking_callback(locking_function);
    }
    return 1;
}
int thread_cleanup()
{
    if(!aMutex)
        return 0;
    CRYPTO_set_id_callback(NULL);
    CRYPTO_set_locking_callback(NULL);
    delete[] aMutex;
    aMutex = NULL;
    return 1;
}

因此,我提供了锁定函数、线程标识符函数,并让locking_函数使用互斥的全局数组。

句子"Mutex locking"answers"Mutex unlock"(在locking_function中打印)打印得非常快。当我破坏CURL手柄时,它会停止。这正常/正确吗?

我打电话给

thread_setup

当我的应用程序启动和

thread_cleanup

当应用程序结束时。

谢谢你的帮助。

The sentences "Mutex locking" and "Mutex unlocking" (which are printed in the locking_function) gets printed over and over really fast.

互斥锁/解锁用于确保一次只有一个线程访问关键部分(这就是为什么它被称为互斥)。在一个多线程程序中,使用一组互斥对象并使用相同的方法来锁定/解锁它们,我预计这两个对象会被调用多次。此外,关键部分的执行通常很快(几行代码)。

所以给你一个直接的答案,是的,你看到的是正常的

请注意,在某些平台上,此代码可能会出现错误:

(unsigned long)std::hash<std::thread::id>()   (std::this_thread::get_id());

std::hash()返回size_t,然后将其强制转换为unsigned long。在Win-64平台上,size_t是64位,unsigned long是32位。