2012-09-18 7 views
13

私はマルチスレッドの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が悪魔を私の鼻から飛ばす原因になりますか?

答えて

3

C++標準では、C++スレッドが他のスレッドライブラリとどのようにやりとりするかは指定されていませんが、一般的には、C++実装で基本システムスレッドライブラリを使用することが期待されます。

システムスレッドライブラリのロックプリミティブを使用するサードパーティのライブラリを使用できることは、動作が期待される一般的な使用例です(そうでなければ、C++スレッドのサポートは実際の状況ではほとんど役に立たないでしょう) )。 Pete氏が指摘しているように、スレッドハンドル/ IDを含むものはもっと難しいかもしれません。

6

C++ 11スレッドには、native_handle()という名前のメンバ関数がある場合とそうでない場合があります。これが実装されているかどうかは実装定義されています。存在する場合は、タイプnative_handle_typeのオブジェクトを返します。この型のオブジェクトをどのように使用できるかは実装定義されています。だからあなたのドキュメントをお読みください。

+1

私はこの答えは尋ねた質問に関連してどのように表示されない - Cライブラリが唯一のシステムのミューテックスを使用する必要があるならば、ネイティブスレッドのハンドルを取得する必要はありません。 – cmeerw

+0

@ペテあなたの答えを詳しく教えてください。 –

+0

@ LexiR - 私の謝罪; @ cmeerwは正解です - 私の答えは、技術的には正しいものの、あなたが尋ねたものには本当に対応していません。一般に、mutexはスレッドの詳細に依存しないので、おそらくネイティブmutexを使うことは大丈夫です。一方、std :: mutexを(std :: lock_guardと一緒に)使用すると、上記で説明した同じnative_handleダンスを使用して、システムミューテックスに到達する可能性のある、例外安全なロックとロック解除を得ることができます。 –

2

実際にライブラリが何をしているかによって異なります。突然変異などのためにpthreadsを使用することは問題ではありません。しかし、ライブラリが実際にpthread_joinのような関数を使ってスレッドを管理しようとすると、問題につながる可能性があります。 std::threadは、pthreadsの周りに非常に薄いラッパーとして実装することができるので、それはまだ実装に依存していて、将来のバージョンでも動作するとは思えませんので、pthreadが標準であるシステム(UNIXなど)ではまだ動作するかもしれません。同じコンパイラの同様の引数はCreateThreadの使用のために作ることができます。

1

新しいCおよびC++標準(C11およびC++ 11)はどちらも同じモデルのスレッドを実装しており、そのインタフェースは互換性があります。 C++ 11スレッドの実装を提供するプラットフォームがあれば、Cでも同じことができます。そうでなければ、それは確かに一時的なものです。

pthreadをネイティブスレッドモデル(おそらくPOSIXプラットフォーム)として使用しているプラ​​ットフォームの場合、C++ 11スレッドはほぼ確実にその上に構築されます。しかし、これら2つのスレッドモデル間の呼び出し規約は似ているだけで、等しくはありません。たとえば、スレッド関数の戻り値は、pthreadの場合はvoid*、C++ 11/C11の場合はintです。

しかし、急いでコンパイラベンダーがC11インターフェイスも提供するのを待つことができない場合は、C++関数の周りに浅いインターフェイスを実装するだけで済みます。これは大したことではありません。

関連する問題