多线程 OpenSSL
Multithreaded OpenSSL
我在多线程程序中将 libcurl 与 OpenSSL 结合使用。基于 Daniel Stenberg 的友善回应和示例
我尝试了以下代码:
static std::mutex* aMutex;
void locking_function(int mode, int n, const char* file, int line)
{
if(mode & CRYPTO_LOCK){
std::cout << "Mutex locking\n";
aMutex[n].lock();
}
else{
std::cout << "Mutex unlocking\n";
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_function 使用全局互斥数组。
句子 "Mutex locking" 和 "Mutex unlocking"(打印在 locking_function 中)的打印速度非常快。当我销毁 CURL 句柄时,它会停止。这是normal/correct吗?
我打电话
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.
Mutex lock/unlock 用于确保一次只有一个线程访问临界区(这就是为什么它被称为互斥)。在多线程程序中,您使用互斥量数组并对 locking/unlocking 它们使用相同的方法,我希望这两个程序会被调用多次。加上临界区的执行通常很快(几行代码)。
所以给你一个直接的答案,是的,你所看到的是正常的
请注意,在某些平台上,此代码可能有错误:
(unsigned long)std::hash<std::thread::id>() (std::this_thread::get_id());
std::hash()
returns size_t
并将其转换为 unsigned long
。在 Win-64 平台上,size_t
是 64 位,unsigned long
是 32 位。
我在多线程程序中将 libcurl 与 OpenSSL 结合使用。基于 Daniel Stenberg 的友善回应和示例
我尝试了以下代码:
static std::mutex* aMutex;
void locking_function(int mode, int n, const char* file, int line)
{
if(mode & CRYPTO_LOCK){
std::cout << "Mutex locking\n";
aMutex[n].lock();
}
else{
std::cout << "Mutex unlocking\n";
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_function 使用全局互斥数组。
句子 "Mutex locking" 和 "Mutex unlocking"(打印在 locking_function 中)的打印速度非常快。当我销毁 CURL 句柄时,它会停止。这是normal/correct吗?
我打电话
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.
Mutex lock/unlock 用于确保一次只有一个线程访问临界区(这就是为什么它被称为互斥)。在多线程程序中,您使用互斥量数组并对 locking/unlocking 它们使用相同的方法,我希望这两个程序会被调用多次。加上临界区的执行通常很快(几行代码)。
所以给你一个直接的答案,是的,你所看到的是正常的
请注意,在某些平台上,此代码可能有错误:
(unsigned long)std::hash<std::thread::id>() (std::this_thread::get_id());
std::hash()
returns size_t
并将其转换为 unsigned long
。在 Win-64 平台上,size_t
是 64 位,unsigned long
是 32 位。