2

当我宣布我的队列为

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

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

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

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

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

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

提前致谢,

4

1 回答 1

4

所以我的问题是boost::lockfree::queue 如果设置了属性fixed_size,是否会变成单生产者单消费者队列?

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

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

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

  • 如果您调用push并且没有更多可用容量,则push失败并返回false

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

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

于 2013-08-07T12:59:38.907 回答