2016-06-24 40 views
1

我們有一段代碼,利用TBB產卵任務來執行一些處理,這是使用下面的TBB代碼初始化TBB線程池完成的(相匹配的內核數量):TBB產卵任務內存泄漏

tbb::task_scheduler_init(8); 

然後我們想要產卵我們用下面的代碼(其中MainTask的從TBB ::任務類派生的)每個任務:

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

當我們運行代碼,我們開始的時候使用一定量的內存,然後隨着程序執行併產生新的任務,如上所述,內存使用量隨着時間逐漸增加。執行40分鐘後,從12KB增加到213KB。這顯然不是我們任何處理代碼的結果,而且似乎是TBB沒有從TBB allocate_root任務中釋放內存的結果,我們一旦完成了他們的執行,TBB allocate_root任務就像我們所期望的那樣。

這是怎麼發生的?有什麼我們需要做的,以解決這個問題,或者有沒有一種替代方法來產生TBB任務而不使用allocate_root方法來解決這個問題?

回答

2

別擔心。 TBB緩存並重用任務內存以提高性能。它具有防止生產者 - 消費者情況下的內存泄漏的特殊機制,其中一個線程繼續分配任務,另一個線程僅消耗它們。

如果您仍懷疑存在內存泄漏,則需要進行更詳細的測試,以證明內存消耗在初始上升後不會停止(當然,這是非線性函數)。 TBB具有檢測內存泄漏的特殊單元測試:請參閱src/test/test_task_leaks.cpp