3

我有疑问。

对于 tbb::memory_pool< tbb::scalable_allocator > shared_memory_pool_;

如果这是在主线程中实例化的。然后,我在工作线程中调用了 shared_memory_pool_.malloc(sizeof(my_class)) 。tbb 会从主堆中分配该大小的内存,还是会从线程“域”中分配它,以便仍然避免由正常 malloc() 引起的锁争用?

4

2 回答 2

3

基于tbb::memory_pool与 相同的内部结构tbb::scalable_allocator。因此,一旦内存池最初获取内存(在您指定的情况下,tbb::scalable_allocator也是如此),它将使用相同的机制在线程之间分配和重用它。即它是可扩展的并且尽可能地避免全局锁。但是,由于内存仍然是一种公共资源,一些线程同步无论如何都是不可避免的。具体来说,我预计初始内存请求会出现更多争用,因为每个线程的缓存还不温暖。而且可扩展分配器试图保持可扩展性和内存消耗之间的平衡,因此它不会因为每线程缓存在线程之间重新分配内存而变得疯狂,这也是一种线程同步(尽管比锁更具可扩展性)。

至于scalable_allocator的[非常]初始内存分配,它通过mmapVirtualAlloc足够大的内存块而不是通过malloc。

于 2014-04-27T09:32:37.703 回答
0

下面是一些关于如何正确实现内存池的有用描述。请注意,据此:

在我们的实现中,我们尝试以线程安全和可扩展的方式提供更通用的功能。为此,内存池的实现基于 TBB 可扩展内存分配器,因此具有相似的速度和内存消耗特性。

希望这可以帮助。

于 2017-09-26T04:28:39.810 回答