线程安全的TBB可扩展分配器

时间:2013-04-10 18:39:09

标签: c++ thread-safety tbb

最近我从系统内存管理(malloc / free)切换到Intel的TBB可扩展分配器。问题是,如果它是线程安全的,我找不到任何信息。整个TBB是围绕线程构建的,所以它似乎合乎逻辑,但如果没有具体的证据,我不想假设这样的事情。但是,我也不想做任何不必要的同步。有没有人对此有一些信息?

2 个答案:

答案 0 :(得分:4)

然后这个来源Intel Threading Building Blocks听起来更直接(参见页面“TBB Scalable Allocator”) -

  

每个线程都有自己的私有堆

     

- 尺寸隔离箱改善了地方性    - 私人堆减少   同步开销和错误共享

更新:来自here -

  

TBB为每个线程池提供可扩展的分配器。          可能仍然存在错误共享。

   example: false sharing could matter in pipelining.

   TBB also provides a cache-aligned allocator, which guarantees
   that any two things you've allocated will never experience
   false sharing. The downside is that it has larger memory
   pressure. This is accomplished by making the minimum allocation
   N cache lines, where N is a small integer.

   In the book, the conventional wisdom is to start with the
   scalable allocator and see if switching to the cache-aligned
   allocator speeds things up.

但虚假分享是关于减速而不是线程安全。

答案 1 :(得分:2)

根据您链接的手册:

  

除非另有说明,否则库的线程安全规则是   如下:

     

两个线程可以在不同的线程上同时调用方法或函数   对象,但不是同一个对象。两个线程是不安全的   在同一对象上同时调用方法或函数。   课程的描述注意偏离了这个惯例。对于   例如,并发容器更自由。就其性质而言,   它们允许在同一容器上进行一些并发操作   对象

使用可扩展的分配器,这意味着两个线程不能同时释放相同的内存,这应该不足为奇。