c++ - TBB tbb::memory_pool<tbb::scalable_allocator<char>> 如何正确使用?

标签 c++ tbb memory-pool

我有疑问。

对于 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 进行的 [非常] 初始内存分配,它通过 mmapVirtualAlloc 获得足够大的内存块,而不是通过 malloc。

关于c++ - TBB tbb::memory_pool<tbb::scalable_allocator<char>> 如何正确使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15490418/

相关文章:

c++ - linux安装kde运行时库的问题

c++ - PVOID buffer转PCHAR有什么意义?

C++:指针值和地址

c++ - 线程构建 block 流程图——创建一个 "counting"节点

c++ - Concurrent_hash_map 实现抛出 SIGSEGV

java - Java 上的垃圾问题太多

c++ - 如何在 C++ 中读取和删除文件中特定字符之间的字符串

c++ - 快速的线程间通信机制

c++ - 在 C++ 中使用模板初始化的静态结构指针

C++11内存池设计模式?