我有疑问。
对于 tbb::memory_pool< tbb::scalable_allocator > shared_memory_pool_;
如果在主线程中实例化。而且,我在工作线程中调用了 shared_memory_pool_.malloc(sizeof(my_class)) 。 tbb 会从主堆分配该大小的内存,还是会从线程“域”分配它,以便仍然可以避免由普通 malloc() 引起的锁争用?
最佳答案
tbb::memory_pool
基于与 tbb::scalable_allocator
相同的内部结构。因此,一旦内存池最初获取内存(在您指定的情况下,也来自 tbb::scalable_allocator
),它将使用相同的机制在线程之间分配和重用它。 IE。它是可扩展的,并尽可能避免全局锁定。不过,由于内存仍然是一种公共(public)资源,一些线程同步无论如何是不可避免的。具体来说,我预计初始内存请求会有更多争用,因为每线程缓存还没有预热;并且 scalable_allocator 试图在可伸缩性和内存消耗之间保持平衡,因此它不会疯狂地使用每线程缓存在线程之间重新分配内存,这也是一种线程同步(尽管比锁更具可伸缩性)。
至于由 scalable_allocator 进行的 [非常] 初始内存分配,它通过 mmap
或 VirtualAlloc
获得足够大的内存块,而不是通过 malloc。
关于c++ - TBB tbb::memory_pool<tbb::scalable_allocator<char>> 如何正确使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15490418/