线程本地提升fast_pool_allocator

时间:2014-04-10 19:43:38

标签: multithreading c++11 boost allocator thread-local-storage

我有一个多线程(Cilk)程序,每个线程使用一个临时的 std::set。这些std::set有很多分配,所以我是 尝试使用一些池分配器,即boost::fast_pool_allocator

using allocator = boost::fast_pool_allocator< SGroup::type >;
using set = std::set<SGroup::type, std::less<SGroup::type>, allocator>;

但现在由于并发访问,表现更糟糕 分配器。一个关键的事实是这些集合从未在集合之间进行通信 线程使我可以使用线程本地分配器。但是,如图所示 以前的代码,我不是构建分配器对象而是传递模板 std::set构造函数的参数。

所以这是我的问题:是否有可能构建多个 boost::fast_pool_allocator将它们用作线程本地池分配器?

修改:我删除了愚蠢的std::pair分配。

1 个答案:

答案 0 :(得分:4)

修改

嗯。我在这里得到了一个答案,我从我记得看到的东西拼凑而成。但是,经过进一步检查,看起来所有的分配器实际上都可以使用单例池,这些单元池在没有同步的情况下从不线程安全。实际上,null_mutex可能出现在detail命名空间:如果您知道程序没有使用线程,那么只有#include <boost/pool/pool.hpp> #include <boost/pool/pool_alloc.hpp> #include <boost/thread.hpp> #include <set> struct SGroup { int data; typedef int type; }; using allocator = boost::fast_pool_allocator<SGroup::type>; using set = std::set<SGroup::type, std::less<SGroup::type>, allocator>; void thread_function() { allocator alloc; // thread local set myset(set::key_compare(), alloc); // do stuff } int main() { boost::thread_group group; for (int i = 0; i<10; ++i) group.create_thread(thread_function); group.join_all(); } 才有意义使用它(好吧,超出主线程) at all

除了这个明显的崩溃,你可以直接使用object_pool。但它不是一个分配器,所以它不会为你的容器示例服务。


原始答案文字

您可以在构造中传递分配器实例:

typedef boost::fast_pool_allocator<SGroup::type,
   boost::default_user_allocator_new_delete,
   boost::details::pool::null_mutex> allocator;

让我阅读有关如何在分配器上禁用线程感知的文档:)

在一个例子中找到它:

boost/libs/pool/example/time_pool_alloc.hpp

{{1}}中的示例应该可以帮助您开始对性能差异进行基准测试