gpt4 book ai didi

c++ - boost::lockfree::spsc_queue的read_available和write_available应该如何使用?

转载 作者:太空宇宙 更新时间:2023-11-04 13:33:10 25 4
gpt4 key购买 nike

Boost documentation for spsc_queue说:

read_available():线程安全且无需等待,只能从生产者线程调用

write_available():线程安全且无需等待,只能从消费者线程调用

我希望最常见的用例正好相反:生产者线程(线程写入数据到队列)需要write_available(),并且消费者线程(线程读取队列中的数据)需要read_available()

如果我需要知道我可以在生产者线程中写入多少队列,我应该使用 QUEUE_CAPACITY - read_available() 吗?

最佳答案

任何类型的大小评估都将成为无锁世界中的一场竞赛。

原因很简单,在您对“测量大小”采取行动之前,其他线程上的大小可能会发生变化。

Single-Producer/Single-Consumer 是特殊,因为消费者知道没有其他人可以从队列中读取(所以“read_available”永远不会减少< em>除非消费者自己阅读)。生产者方面也是如此。

显然 write_available 是您所需要的。当然,到您实际写作时,它可能更多,但您无法获得更准确的信息。至少它永远不会less(毕竟只有 1 个生产者线程)。

Note that the documentation appears to be in error (swapping the allowed threads)

This made me double check, and sure enough they use the functions internally in the expected ways (contradicting the erronous documentation claim):

ConstIterator push(ConstIterator begin, ConstIterator end, T * internal_buffer, size_t max_size)
{
const size_t write_index = write_index_.load(memory_order_relaxed); // only written from push thread
const size_t read_index = read_index_.load(memory_order_acquire);
const size_t avail = write_available(write_index, read_index, max_size);

我衷心建议使用此处显示的范围推送来自动推送可能的确切项目数。例如:

auto b = messages.begin(), e = messages.end();
do {
b = a.push(b, e)
} while (b != e);

关于c++ - boost::lockfree::spsc_queue的read_available和write_available应该如何使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30696326/

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