2016-06-24 7 views
3

を増やします我々は(MainTaskがTBB :: Taskクラスから派生される)次のコードを使用産卵したい:私たちは私たちのコードを実行するとTBBのスレッドプールが突然私たちは、これはTBBのスレッドプールを初期化するために、次のTBBコードを使用して行われ、いくつかの処理を実行するタスクを起動するためにTBBを利用したコードの一部を持っている

task = new (tbb::task::allocate_root()) MainTask(theAction, theOutputData); 
tbb::task::enqueue(*task); 

我々はの数と同じであるスレッドプールで始めますコア(この場合は8スレッド)を期待通りに実行しますが、プログラムが実行され、上で説明したように、いくつかのランダムなポイントでのスレッドの数が突然増加します。プログラム実行の40分後にスレッド数が8から15に増加します。

どうしてですか? TBBは、ワーカースレッドの数をコアの数と同じに保つべきではありませんか?

+1

スレッドがTBBの外部に作成されている可能性はありますか?スレッドはシステムリソースであり、プログラムの他の部分でも作成できます。 – lcs

+0

''タスク 'を'新しく '編集した場合、' 'それを' '削除しますか? – kangshiyin

答えて

1

私はあなたに別の答えに言ったように:

TBBを防止素晴らしい仕事をしていません:-)心配しないで、実際のオーバーサブスクリプション - 唯一の8つのスレッドが同時にあなたのプログラムでアクティブになります。さまざまな理由から、ハードウェアリソースよりも多くのスレッドが必要になることがあります。 1つの例は、マスタスロットが予約されていないtbb::task_arenaであり、プール内のアクティブなスレッドの数を動的に変更することを可能にする最近の追加はtbb::global_controlクラスです。残念ながら、TBBがどのようにそれを実装するかは、データ競争のためのスペースを残します。スレッドが新しいスレッドが到着している間にスリープ状態になるためにスレッドプールに戻っている途中で、直ちに処理が開始されるように8つのスレッドがすべて要求されます。中間状態のこれらのスレッドはスレッドプールではまだ説明されず、新しいスレッドは代わりに作成されます。

TBBは、このデータレースのウィンドウをできるだけ減らしましたが、完全に閉じることで、一般的なパフォーマンスに影響を及ぼすホットパスでの同期が必要でした。したがって、データ競争を可能にし、ホットパスでの障害を少なくするという決定が下されました。

しかし、TBBにはこのように作成できるスレッドの最大数にハード制限があるため、リソースリークはありません。プラットフォームによっては、この数値は2倍から4倍に変わります(内部実装の仕様は変わりませんが)。

私は、これまでに15スレッドのスレッドが作成されていることに驚いています。私はあなたの懸念を理解しています。あなたがそれらと再生器を共有するなら、TBBチームは感謝します。あなたはTBB ForumまたはOSS siteのいずれかを使って再生器を提供することができます。

+0

お返事ありがとうございますが、私たちはいくつかのフォローアップの質問をしています。 1.再生装置とは何ですか? 2.どのように作成して提出しますか? –

+0

@ S.J.Thunderstick再生装置は、問題を再現する最小限のテストです。テストを作成し、フォーラムまたは投稿として公開します。しかし、もう一度、それはとにかく大きな問題ではありません - それはリークでもなく、過剰購読でもありません – Anton

関連する問題