在fixed_sized<true>的情况下提高无锁队列行为
boost lockfree queue behavior in case fixed_sized<true>
当我将队列声明为时
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队列(例如,成员函数push
和pop
是线程安全的)。
有关讨论,请参阅对OP的评论。简称:
如果我正确解释文档,fixed_size<true>
策略意味着以下更改:
-
如果调用
push
,但没有其他可用容量,则push
将失败并返回false
。 -
可设置的最大容量通常限制为216-2个元件。
-
由于容量不是自动更改的,您必须通过ctor
queue(size_type)
或reserve
成员函数手动设置容量。默认ctor将容量设置为0
。(这意味着对于0
的默认容量,每个push
都将失败。)
- 松弛原子与无同步情况下的记忆连贯性
- 如何在没有死锁和/或争用的情况下正确使用 std::mutex C++?
- C++数组与向量排序(在我的情况下,向量比数组慢~2.5倍(无优化))
- 在没有任何锁的情况下加入另一个线程后是否需要内存围栏?
- UDP 套接字 select() 在某些情况下无延迟(超时)返回 1
- 无锁队列实现中的虚假下溢C++
- 我可以在没有任何锁的情况下从不同的线程读取内存缓冲区吗?
- 无符号 int 与无符号长 两者都是 32 位,但我无法在不转换的情况下混合它们......为什么?
- 在没有互斥锁的情况下重新计数时如何避免竞争条件?
- 在这种情况下如何正确使用互斥锁
- 如何在使用和无发现的情况下使用和不使用的字符串向量搜索元素
- 默认情况下,决定整数类型是唱歌或无符号的类型
- 给定一个填充无符号字符**的 C 函数,如何在没有中间副本的情况下用数据填充 std::vector
- 如何在锁定互斥锁的情况下处理主线程中的信号
- 如何在不使用循环的情况下将低字节和高字节的字符数组转换为它们的整数数组
- 我可以在不复制的情况下将 std::vector 重新解释<char>为 std::vector<无符号字符>吗?
- 在fixed_sized<true>的情况下提高无锁队列行为
- 在什么情况下,无锁数据结构比基于锁的数据结构更快
- 我们可以在不锁定两个或更多无锁容器的情况下原子地做一些事情吗?
- 在没有实例(仅类型)的情况下调用无状态lambda