在fixed_sized <true> </true>的情况下提升lockfree队列行为

时间:2013-07-29 15:00:31

标签: c++ boost queue lock-free

当我将队列声明为

typedef boost::lockfree::queue<MyMessage, boost::lockfree::fixed_sized<true>> MessageQueue

并且我尝试将队列用作多生产者单消费者队列,即从多个线程向其发布消息并轮询队列以获取来自单个线程的消息,消费者线程被锁定。什么都没有前进。

但是当我不使用固定大小属性时,即不指定模板参数fixed_sized<true>,队列工作正常。但在这种情况下,队列实际上进行了内存分配/释放,这违背了使用无锁队列的目的。

所以我的问题是“如果使用属性fixed_sized<true>设置,boost :: lockfree :: queue会成为单生产者 - 单一消费者队列吗?”

我需要使用一些不同的推/弹方法吗?

我想要一个不进行内存分配释放的MPMC队列。如果boost不提供此功能,是否还有其他可以使用的队列?

提前致谢,

1 个答案:

答案 0 :(得分:4)

  

所以我的问题是如果使用属性fixed_size设置,boost :: lockfree :: queue会成为单生产者 - 单一消费者队列吗?

答案:根据docs,没有。成员函数具有不同的线程安全性,但无论策略是fixed_size<true>还是fixed_size<false>(例如成员函数pushpop,您都可以将lockfree队列用作MRMW队列是线程安全的。

请参阅OP的评论进行讨论。简短版本:

如果我正确解释文档,fixed_size<true>政策意味着以下更改:

  • 如果您致电push并且没有其他容量可用,push将失败并返回false

  • 可以设置的最大容量通常限制为2 16 -2个元素。

  • 由于容量未自动更改,您必须通过ctor queue(size_type)reserve成员函数手动设置容量。默认ctor会将容量设置为0。 (这意味着对于0的默认容量,每push都会失败。)