2013-03-19 114 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可扩展内存分配器,因此 具有类似的速度和内存消耗属性。

希望这会有所帮助。