如何使用boost :: lockfree :: queue entities

时间:2018-02-13 08:28:25

标签: c++ boost lock-free

考虑以下代码

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;

};

1 个答案:

答案 0 :(得分:2)

锁定基元和无锁对象很少可以移动。

这是有道理的,因为根据定义他们打算共享。共享时,对象标识必须保持不变,否则一方可能会移动该对象,而另一方仍尝试在旧位置访问该对象。

对于您的代码示例,我不相信您需要无锁容器。