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位。
相关文章:
- Openssl 1.1.1d无效使用不完整的类型"struct dsa_st"
- 如何在openssl-ecc中获取十六进制格式的私钥
- LINK 尝试使用 OpenSSL evp aes 256 c++ 时出错
- 如何在OpenSSL中从configuration.h.in获取configuration.h
- OpenSSL TLS服务器-使用客户端证书白名单
- 通过 Openssl 命令行加密,通过 c++ 解密
- 使用已使用 java 编码的 openssl 解码数据
- OpenSSL没有共享密码
- OpenSSL 解密功能无法正常工作
- OpenSSL BIO and SSL_read
- 如何在OpenSSL库的名称中添加后缀'd'?
- 避免碎片化的ClientHellos with OpenSSL (DTLS)
- Boost.Asio/OpenSSL HTTPS GET certificate trouble
- 使用 OpenSSL 从内存中读取原始 SSL/TLS 证书
- 验证openssl c++中的签名,这是由JAVA DSA签名的?
- OpenSSL: EC_POINT_set_compressed_coordinates_GFp segfault
- 在 C/C++ 中加载 OpenSSL 自定义引擎
- 我的应用程序无法在安卓上使用OpenSSL进行链接
- OpenSSL fips in C++ wrapper Library 如何?错误:指纹不匹配
- 比较两个公钥与OpenSSL API