2017-04-21 7 views
0

私はtbb::parallel_forを使用して、メインスレッドから呼び出されるループをマルチスレッドに使用しています。そのループでは、進行状況を反映するためにUIを更新するメインスレッドが必要です。私が観察したことから、tbb::parallel_forは常に呼び出し元スレッド+ Nワーカースレッドを使用します。しかし、私は、呼び出しスレッドの使用が保証されているのか、まさにそのような場合に起こったのか、疑問に思っています。ここでtbb :: parallel_forは常に呼び出し側のスレッドを利用しますか

は、サンプルコードは次のとおりです。

static thread_local bool _mainThread = false; // false in all threads 
_mainThread = true;       // now true in main thread, but false in others 
tbb::parallel_for(start, end, *this); 

void Bender::processor::operator()(size_t i) const 
{ 
... 
      if(_mainThread)      // only main thread will issue events 
       ProgressUpdatedEvent(progress); 
} 

ありがとう!

答えて

2

厳密に言えば、特定のスレッドが実行されることについてTBBが保証するものはありません(TBBの基本原則はオプションの並列処理とランダムな作業盗みです)。特定の作業者が親和性のあるタスクをとることが保証されていないため、TBBのタスクアフィニティさえも「ソフト」です。

parallel_forがどのように実装されるかは、何かに切り替えてparallel_forを終了する前に少なくとも1つのタスクを実行することを意味します。したがって、少なくとも単純なケースでは、十分にうまくいくことが期待されます。

関連する問題