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