我在写一个多线程的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'舞蹈可能会进入系统互斥体。 –