可以检查提升::无锁::队列是否已满吗?



我正在使用boost::lockfree::queue Foo(128)。

在弹出队列之前,我可以通过Foo.empty()函数检查队列的空状态。

我想知道我是否可以在推送之前以类似的方式检查其满负荷状态!在网上找不到任何解释如何做到这一点的资源。

有什么建议吗?

看来 Boost 的 LF 多生产者多消费者queue实现不支持这一点。 其他 MPMC 队列可能会。

boost::lockfree::spsc_queue(单生产者单消费者环形缓冲区队列)可以,spsc.write_available() > 0.


默认情况下,boost::lockfree::queue不是固定大小的,仅当您将容量作为模板 arg 传递时,才fixed_sized<true>.如果数据结构配置为固定大小,则内部节点存储在数组中,并通过数组索引对其进行寻址。(但它不像其他一些 MPMC 队列那样是环形缓冲区。 否则,它们将被动态分配并保留在免费列表中。

为了提高性能,您可能应该将其设置为固定大小。 或者,如果您想限制动态分配,您可以使用bounded_push而不是push,因此它将返回 false 而不是转到操作系统以获取更多内存(可能不是无锁的)。


如果您使用的是queue<fixed_size<true>>,则队列可能会已满。

但是单独检查没有多大意义,因为另一个生产者可能会在检查和推送之间使队列已满。 您是否正在寻找性能优化,例如避免构造对象,如果队列在您准备好调用push时可能仍然已满?

(此外,使用者可能会在您检查后立即使队列未满,因此只有在尝试推送的过程中进行检查才有意义。 也许甚至没有一种有效的无锁检查方法。 否则,他们可以让函数始终为非固定大小的队列返回 true,并为固定大小的队列返回有意义的结果。

这就是为什么push()返回boolfalse表示队列已满(或者无法为非固定大小的队列分配新节点)。


在弹出队列之前,我可以通过Foo.empty()函数检查队列的空状态。

我希望你实际上没有这样做;它有与push相同的与其他线程竞争的问题,并且优化的机会更少。 在尝试之前没有要构建的对象,您只需调用pop,看看您是否得到一个。

另一个线程可能会在您的支票和实际弹出之间使队列为空或使其非空。 除非你是唯一的消费者,在这种情况下,看到非空确实意味着你绝对可以弹出。 多生产者单一消费者用例将与spsc_queue不兼容。

无论如何,这就是为什么它bool pop(T &);T pop().

相关内容

  • 没有找到相关文章

最新更新