如何用 boost::lockfree::queue 个实体填充容器
How to populate container with boost::lockfree::queue entities
考虑以下代码
struct foo
{
foo()
{
size_t someCalculatedValue = 2;
bar.resize(someCalculatedValue*4);
std::generate(bar.begin(), bar.end(), [&someCalculatedValue]() {return boost::lockfree::queue<int>(0xFFFF * someCalculatedValue); });
}
std::vector<boost::lockfree::queue<int>> bar;
};
无法编译,抱怨删除了复制构造函数。 queue
是不可复制的,没关系,但看起来它也是不可移动的?我错过了什么吗?有没有办法用这些填充stl容器?
当然,如果64k的容量足够的话,也可以使用下面的东西。
struct boo
{
using LocklessQueue = boost::lockfree::queue<int, boost::lockfree::capacity<0xFFFF-1>>;
boo()
{
size_t someCalculatedValue = 2;
bar = std::vector<LocklessQueue>(someCalculatedValue*4);
}
std::vector<LocklessQueue> bar;
};
锁定原语和无锁对象很少移动。
这是有道理的,因为根据定义,它们旨在共享。共享时,对象标识必须保持不变,否则一方可能会移动对象,而另一方仍试图在旧位置访问它。
就您的代码示例而言,我不相信您需要无锁容器。
考虑以下代码
struct foo
{
foo()
{
size_t someCalculatedValue = 2;
bar.resize(someCalculatedValue*4);
std::generate(bar.begin(), bar.end(), [&someCalculatedValue]() {return boost::lockfree::queue<int>(0xFFFF * someCalculatedValue); });
}
std::vector<boost::lockfree::queue<int>> bar;
};
无法编译,抱怨删除了复制构造函数。 queue
是不可复制的,没关系,但看起来它也是不可移动的?我错过了什么吗?有没有办法用这些填充stl容器?
当然,如果64k的容量足够的话,也可以使用下面的东西。
struct boo
{
using LocklessQueue = boost::lockfree::queue<int, boost::lockfree::capacity<0xFFFF-1>>;
boo()
{
size_t someCalculatedValue = 2;
bar = std::vector<LocklessQueue>(someCalculatedValue*4);
}
std::vector<LocklessQueue> bar;
};
锁定原语和无锁对象很少移动。
这是有道理的,因为根据定义,它们旨在共享。共享时,对象标识必须保持不变,否则一方可能会移动对象,而另一方仍试图在旧位置访问它。
就您的代码示例而言,我不相信您需要无锁容器。