我在寫一個多線程的C++程序,並希望使用多線程C庫。
該庫的預期,我使用原生系統的方法來創建它的一些工作線程,並通過控制其run()函數中使用如下代碼:混合C++ 11 std ::線程和C系統線程(即pthreads)
void system_specific_thread_init();
#ifdef _WIN32
DWORD WINAPI system_specific_thread_run(LPVOID unused)
{
library_run();
return 0;
}
void system_specific_thread_init()
{
Createthread(NULL, 0, system_specific_thread_run, NULL, 0, NULL);
}
#else
void* system_specific_thread_run(void *unused)
{
library_run();
return NULL;
}
void system_specific_thread_init()
{
pthread_t id;
pthread_create(&id, NULL, system_specific_thread_run, NULL);
}
#endif
system_specific_thread_init();
後,它會使用相關的原生系統互斥方法到其他本地系統線程在繼續時調用它的功能是自己的工作。
但是,我正在使用C++ 11 <thread>
庫來創建和管理我的所有線程。我希望用std::thread(library_run)
創建工作線程,並從其他這樣的線程調用庫函數。
這樣做是否安全,還是DS9K會導致惡魔從我的鼻子飛出?
我不明白這個答案是如何與問題相關的 - 如果C庫只需要使用系統互斥體,那麼就不需要獲得本地線程句柄。 – cmeerw
@Pete請你詳細說明你的答案嗎? –
@LexiR - 我的歉意; @cmeerw是正確的 - 我的答案雖然技術上正確,但並不能真正解決您提出的問題。一般來說,互斥體不依賴於線程細節,因此使用本地互斥體可能是可以的。另一方面,如果你使用std :: mutex(和std :: lock_guard一起),你可以獲得異常安全的鎖定和解鎖,與我上面描述的相同的'native_handle'舞蹈可能會進入系統互斥體。 –