2017-06-26 16 views
2

スレッドに関する質問に正確な答えが見つからないようです。私は現在OpenNI2を使ってKinect V2センサーに新しいフレームデータをポーリングするプログラムを持っています。問題は、各タイプのセンサーをポーリングする必要があることです。深度、IR、RGBを別々に取得することができます。ここで私のスレッドの質問が出てくるところです。3つのセンサーのそれぞれを個別のスレッドでポーリングし、すべての関数呼び出しが返されたときにデータ処理を続けます。複数のスレッドを待っているC++

私は新しいスレッドをメインスレッドにリンクして、プログラムが終了する前にすべてのスレッドが終了するようにする方法を理解していますが、特定のスレッドセットが終了するまでプログラムの途中でどのように待つのですか?私が見落としている、またはmutexやセマフォを使って手作業で行う必要がある、C++ 11のstd :: threadの機能や機能はありますか?

擬似コード:

std::thread thread_RGB(Kinect::readFrame(Enum::RGB), kinect_1); 
std::thread thread_IR(Kinect::readFrame(Enum::IR), kinect_1); 
std::thread thread_depth(Kinect::readFrame(Enum::depth), kinect_1); 

// Wait for all threads to finish getting new frame data 
... 

// Process data here 
process_data(kinect_1.RGB_data); 
process_data(kinect_1.IR_data); 
process_data(kinect_1.depth_data); 
+1

結果として、すべてのスレッドに対して「join()」を呼び出します。 –

+0

そうだけど、一度スレッドに参加すれば、すべての実行が終了したかどうかをどうやって伝えますか?すべてのスレッドが完了するまでメインスレッドが終了しないようにするだけで参加しません。実装する方法がわからない部分は、コードの途中で終了するのを待つことです。 – Wired365

+0

'thread_RGB.join(); thread_IR.join(); thread_depth.join(); 'を呼び出すか、スレッドをコンテナに格納し、コンテナのループ内でjoin()を呼び出します。 –

答えて

2

あなたは、スレッドが終了した後、それらを破壊するのを待つために.joinメソッドを呼び出す必要があります。 t.join()に電話すると、スレッドがまだ何かをしているかどうかのチェックがあり、作業が完了するとスレッドが結合されます。スレッドが結合可能でない場合(t.joinable()もあります)、メインスレッドはセカンダリスレッドが処理を終了して結合するまで待機します。

これらの行を追加することができます。

thread_RGB.join(); 
thread_IR.join(); 
thread_depth.join(); 

これは、Googleで見つけた画像で、thread::join()の仕組みを示しています。

関連する問題