Я использую libcurl с OpenSSL в многопоточной программе. На основе любезного ответа от Daniel Стенберг и примерыМногопоточность OpenSSL
Я попытался следующий код:
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;
}
Так что обеспечить блокировку функции, функции идентификатора потока и пусть функция блокировки использует глобальный массив мьютексов.
Предложения «Блокировка Mutex» и «Разблокировка Mutex» (которые печатаются в функции lock_function) печатаются снова и снова очень быстро. Когда я уничтожаю ручку CURL, она останавливается. Это нормально/правильно?
Я называю
thread_setup
когда мой запуск приложения и
thread_cleanup
при завершении приложения.
Спасибо за любую помощь.
Спасибо! У меня есть достойное понимание мьютексов и многопоточности в целом, но очень мало опыта работы с OpenSSL и libcurl, поэтому на самом деле не знаю, какое поведение ожидать от OpenSSL. – jensa