2016-06-24 18 views
1

我々は、これがTBBスレッドプールを初期化するために、次のTBBコードを使用して行われるいくつかの処理を実行するタスクを起動するためにTBBを利用するコードの一部を有するリーク(コアの数と一致する):TBBスポーンタスクメモリは

tbb::task_scheduler_init(8); 

はその後、我々は、我々は(MainTaskがTBB :: Taskクラスから派生される)次のコードを使用産卵する各タスクのために:私たちは私たちのコードを実行すると

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

我々は、一定量を使用して始めます上述したように、プログラムが実行して新たなタスクを発生させると、メモリ時間の経過と共に使用量が徐々に増加します。実行40分で、12KBから213KBに増加します。これは私たちの処理コードの結果として挑戦的なことではなく、TBBが結果を期待しているように実行を完了したら作成しているTBB allocate_rootタスクからメモリを解放しないように思われます。

どうしてですか?この問題を解決するために何か他に必要なことはありますか、またはこの問題を解決するallocate_rootアプローチを使用せずにTBBタスクをスポーンする別の方法がありますか?

答えて

2

心配はいりません。 TBBはパフォーマンスを向上させるためにタスクメモリをキャッシュして再利用します。また、1つのスレッドがタスクを割り当て続け、別のスレッドがタスクを消費するだけの、プロデューサ - コンシューマの場合のメモリリークを防ぐ特別なメカニズムがあります。

まだメモリリークが疑われる場合は、最初の上昇後にメモリ消費が停止しないことを証明するより精巧なテストが必要です(もちろん、非線形関数です)。 TBBにはメモリリークを検出するための特別なユニットテストがあります:src/test/test_task_leaks.cpp

関連する問題