c++ - 如何使用 boost::lockfree::queue 实体填充容器

标签 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;

};

最佳答案

锁定原语和无锁对象很少是可移动的。

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

就您的代码示例而言,我不相信您需要无锁容器。

关于c++ - 如何使用 boost::lockfree::queue 实体填充容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48762397/

相关文章:

c++ - 将具有不可复制字段的对象插入 std::vector

c++读取(.cso)编译的着色器对象返回\0

c++ - __forceinline 的执行速度是否比 __inline 快?

c++ - 谷歌测试和静态局部变量

c++ - 正则表达式 - 单词边界失败

c++ - Dijkstra 最短路径与 VertexList = ListS in boost graph

c++ - 64位指针的无锁内存回收

c++ - 获取 URL token 的正则表达式是什么?

c++ - 读者/作者锁...没有读者锁?

c++ - 操作和无锁数据结构的重新排序