我有一个多线程(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
分配。
答案 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}}中的示例应该可以帮助您开始对性能差异进行基准测试