wei*_*ima 3 c++ queue boost lock-free
当我将我的队列声明为
typedef boost::lockfree::queue<MyMessage, boost::lockfree::fixed_sized<true>> MessageQueue
Run Code Online (Sandbox Code Playgroud)
我尝试将队列用作多生产者单消费者队列,即从多个线程向其发布消息并轮询队列以获取来自单个线程的消息,消费者线程被锁定。没有任何进展。
但是当我不使用固定大小属性时,即不指定模板参数时fixed_sized<true>,队列工作正常。但在这种情况下,队列实际上进行了内存分配/释放,这违背了使用无锁队列的目的。
所以我的问题是“如果使用该属性设置,boost::lockfree::queue 是否会成为单生产者单消费者队列fixed_sized<true>?”
我需要使用一些不同的推送/弹出方法吗?
我想要一个不进行内存分配释放的 MPMC 队列。如果 boost 不提供这个,我可以使用任何其他队列吗?
提前致谢,
所以我的问题是,如果设置了固定大小属性,boost::lockfree::queue 是否会成为单生产者单消费者队列?
答案:根据文档,没有。fixed_size<true>成员函数具有不同的线程安全性,但是无论策略是or fixed_size<false>(例如成员函数push和pop都是线程安全的),您都可以将无锁队列用作 MRMW 队列。
请参阅 OP 的评论进行讨论。简洁版本:
如果我正确地解释了文档,则该fixed_size<true>政策意味着以下更改:
如果您调用push并且没有更多可用容量,push则会失败并返回false。
可以设置的最大容量通常限制为 2 16 -2 个元素。
由于容量不会自动更改,因此您必须通过 ctorqueue(size_type)或reserve成员函数手动设置容量。默认 ctor 会将容量设置为0。(这意味着对于 的默认容量0,每个push都会失败。)