私はマルチスレッドのC++プログラムを作成しており、マルチスレッドのCライブラリを使いたいと思っています。
このライブラリは、私はそれにいくつかのワーカースレッドを作成して、このようなコードを使用して、その実行()関数に制御を渡すためにネイティブシステムのメソッドを使用する予定:C++ 11 std :: threadと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
@ペテあなたの答えを詳しく教えてください。 –
@ LexiR - 私の謝罪; @ cmeerwは正解です - 私の答えは、技術的には正しいものの、あなたが尋ねたものには本当に対応していません。一般に、mutexはスレッドの詳細に依存しないので、おそらくネイティブmutexを使うことは大丈夫です。一方、std :: mutexを(std :: lock_guardと一緒に)使用すると、上記で説明した同じnative_handleダンスを使用して、システムミューテックスに到達する可能性のある、例外安全なロックとロック解除を得ることができます。 –