gpt4 book ai didi

c++ - 是否可以检查 boost::lockfree::queue 是否已满?

转载 作者:行者123 更新时间:2023-11-30 03:17:31 25 4
gpt4 key购买 nike

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

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

我想知道我是否可以在推送之前以类似的方式检查其满负荷状态!无法在网上找到任何资源来说明如何操作。

有什么建议吗?

最佳答案

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

boost::lockfree::spsc_queue (单生产者单消费者环形缓冲区队列)确实如此,用spsc.write_available() > 0 .


boost::lockfree::queue is not fixed-size by default ,仅当您将容量作为模板参数传递时,或 fixed_sized<true> . 如果数据结构配置为固定大小,则内部节点存储在数组中,并通过数组索引寻址。(但它不像其他一些 MPMC 队列那样是环形缓冲区。)否则它们是动态分配的,并保存在空闲列表中。

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


如果您使用的是 queue<fixed_size<true>> ,那么队列有可能变满。

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

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

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


Before Popping the queue I can check the queue for empty status by Foo.empty() function.

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

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

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

关于c++ - 是否可以检查 boost::lockfree::queue 是否已满?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55394996/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com