使用OpenSSL和锁随机崩溃的多线程程序
Multithreaded program using OpenSSL and locks randomly crashes
我有使用OpenSSL方法签署肥皂文档的逻辑,例如:
OpenSSL_add_all_digests,
SSL_load_error_strings();
ERR_load_BIO_strings();
OpenSSL_add_all_algorithms();
OpenSSL_add_all_digests();
EVP_DigestUpdate
等等。当然,用于对文档进行签名的每个逻辑都在不同的线程中运行。
根据有关该主题的许多主题,我创建了用于处理OpenSSL线程的静态类:
unsigned long SomeStaticClass::pthreads_thread_id(){
unsigned long ret;
ret = ( unsigned long )pthread_self();
return ret;
}
void SomeStaticClass::pthreads_locking_callback( int mode, int type, const char* /*file*/, int /*line*/ ){
if( mode & CRYPTO_LOCK ){
printf("CRYPTO_LOCK_MODE type: %dn", type);
pthread_mutex_lock( &( lock_cs[type] ) );
}
else{
printf("UNLOCK type: %dn", type);
pthread_mutex_unlock( &( lock_cs[type] ) );
}
}
void SomeStaticClass::thread_setup(){
printf("THREAD SETUPn");
lock_cs = ( pthread_mutex_t* )OPENSSL_malloc( CRYPTO_num_locks() * sizeof( pthread_mutex_t ) );
for( int i = 0; i < CRYPTO_num_locks(); i++ ){
pthread_mutex_init( &( lock_cs[i] ), NULL );
}
CRYPTO_set_id_callback( SomeStaticClass::pthreads_thread_id );
CRYPTO_set_locking_callback( SomeStaticClass::pthreads_locking_callback );
}
void SomeStaticClass::thread_cleanup(){
printf("THREAD CLEANUPn");
CRYPTO_set_id_callback( NULL );
CRYPTO_set_locking_callback( NULL );
for( int i = 0; i < CRYPTO_num_locks(); i++ ) {
pthread_mutex_destroy( &( lock_cs[i] ) );
}
OPENSSL_free( lock_cs );
}
我离开了printf进行调试。我知道其中一些方法已被弃用,但我只能使用 openssl 0.9.8。
我在运行线程之前运行thread_setup,在加入它们之后运行thread_cleanup。不幸的是,当我使用许多线程时,我的应用程序仍然随机崩溃。我在pthreads_locking_callback打电话后就得到了 SIGSEGV,因为我上了控制台CRYPTO_LOCK_MODE type: 2
。根据回溯,它在调用OpenSSL_add_all_digests或EVP_DigestUpdate后崩溃。
所以问题是为什么OpenSSL崩溃,因为我正在使用正确的方法来处理多线程程序。我错过了什么?
编辑:它不是与pthreads一起使用OpenSsl的教程的重复,因为正如我提到的,我已经在多线程应用程序中使用此经典函数。
编辑2:它有效! 看起来@Matt卡斯韦尔是对的。谢谢你的正确答案。
所有这些函数:
SSL_load_error_strings();
ERR_load_BIO_strings();
OpenSSL_add_all_algorithms();
OpenSSL_add_all_digests();
是库初始化函数。您应该在调用其他 OpenSSL 函数之前调用它们一次。这些不是线程安全的。在设置锁定回调之前致电他们。
相关文章:
- 试图创建一个多线程程序来查找0-100000000之间的总素数
- sigwait() 在多线程程序中不起作用
- 多线程程序中出现意外的内存泄漏
- C++多线程程序:变量定义为类成员的隔离错误
- 在以读取为主的多线程程序中,可以使用原子来减少锁定吗
- 多线程程序中的分段故障和gdb回溯上的不完整信息
- 多线程程序卡在优化模式下,但在 -O0 中正常运行
- 在使用 std::cout 和多线程程序中如何避免数据竞争<iomanip>?
- 控制多线程程序中的输出流
- 使用 vector<thread> 和 .join() 未并行运行的多线程C++程序
- gdb:在多线程程序中调用函数,不进行线程
- 关于多线程程序中的临时对象
- C 中的多线程程序:在标志变量上使用Mutex
- c++:写入多线程程序中的文件
- 使用优化编译时的多线程程序块
- 如何读取锁定多线程C++程序
- 使用OpenSSL和锁随机崩溃的多线程程序
- 多线程程序中的K最近的邻居
- MFC多线程程序可以以并行方法运行
- 在多线程程序中创建OpenGL结构