在fixed_sized<true>的情况下提高无锁队列行为

boost lockfree queue behavior in case fixed_sized<true>

本文关键字:情况下 高无锁 队列 true fixed sized lt gt      更新时间:2023-10-16

当我将队列声明为时

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

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

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

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

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

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

提前感谢,

所以我的问题是如果使用属性fixed_size设置,那么boost::lockfree::queue是否会变成单个生产者-单个消费者队列

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

有关讨论,请参阅对OP的评论。简称:

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

  • 如果调用push,但没有其他可用容量,则push将失败并返回false

  • 可设置的最大容量通常限制为216-2个元件。

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

相关文章: