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



spsc_queue的Boost文档说:

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

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

调用

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

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

在无锁的世界里,任何类型的大小评估都将是一场竞赛。

原因很简单,因为在您对"测量的大小"采取行动之前,大小可能会在其他线程上更改。

单生产者/单消费者是特殊的,因为消费者知道没有其他人可以从队列中读取(所以"read_available"永远不会减少,除非消费者自己读取)。对于生产者也是如此。

很明显,write_available是你需要的。当然,在您实际编写时可能比多,但您无法获得更准确的结果。至少它永远不会小于(毕竟只有1个生产者线程)。

注意文档出现错误(交换允许的线程)

这让我仔细检查了一下,果然他们在内部以预期的方式使用了这些函数(与错误的文档声明相矛盾):

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);

相关内容

  • 没有找到相关文章

最新更新