2013-03-19 110 views
2

我有疑問。TBB tbb :: memory_pool <tbb :: scalable_allocator <char>>如何正確使用它?

對於tbb :: memory_pool < tbb :: scalable_allocator> shared_memory_pool_;

如果它在主線程中被實例化。而且,我在工作線程中調用了shared_memory_pool_.malloc(sizeof(my_class))。 tbb會從主堆中分配這樣大小的內存,還是會從線程「域」中分配它,以避免普通malloc()引起的鎖爭用?

+0

是否有線程特定的堆?線程通常有自己的堆棧空間,但是與創建它們的進程共享堆。 – Praetorian 2013-03-19 02:29:18

+0

我也不清楚,因爲該文件沒有明確說明,但從我所知,scalable_allocator不直接從動態堆分配內存,所以它不會阻止melloc()系統調用 – 2013-03-19 02:32:36

+0

我不應該說動態堆,沒有這樣的事情。我的意思是系統調用malloc()使用的「共享堆」。 – 2013-03-19 02:50:01

回答

2

tbb::memory_pool基於與tbb::scalable_allocator相同的內部結構。因此,一旦內存池最初抓取內存(在您的情況下,您也可以從tbb::scalable_allocator中獲得),它將使用相同的機制在整個線程中分配和重用它。即它是可擴展的並儘可能避免全局鎖定。儘管如此,由於內存仍然是一種常見的資源,無論如何,一些線程同步是不可避免的。具體來說,我預計會有更多的初始內存請求爭用,因爲每個線程緩存還不熱;並且scalable_allocator也試圖保持可伸縮性和內存消耗之間的平衡,因此不會因爲每線程緩存重新分配線程之間的內存而引起瘋狂,這也是線程同步的一種(儘管比鎖更具可伸縮性)。

對於[十分]初始內存scalable_allocator分配,它通過mmapVirtualAlloc的足夠大的內存塊,而不是通過malloc的。

0

Here是關於如何正確實現內存池的一些有用的描述。請注意:

在我們的實現中,我們試圖以線程安全和可伸縮的方式提供更通用的功能 。爲此,內存池的實現 基於TBB可擴展內存分配器,因此 具有類似的速度和內存消耗屬性。

希望這會有所幫助。