gpt4 book ai didi

c++ - 我可以从第三个线程监控 boost::lockfree::spsc_queue 吗?

转载 作者:行者123 更新时间:2023-11-30 04:56:55 26 4
gpt4 key购买 nike

我有一个线程在 boost::lockfree::spsc_queue 上生成数据,以及一个线程消耗数据。我可以让第三个线程使用 read_available 监视队列吗?或 write_available ?我对准确计数不感兴趣,但我想知道队列是否在稳步增长,因为这意味着消费者跟不上。文档指出 read_available是:

Thread-safe and wait-free, should only be called from the consumer thread

( https://www.boost.org/doc/libs/1_68_0/doc/html/boost/lockfree/spsc_queue.html )

如果第三个线程试图调用 read_available 会发生什么?如果它只是得到一个不准确的计数,那很好。如果它可以获得随机数,或者以某种方式破坏事物,那么我想我会使用 std::atomic<int> 进行计数。 .

最佳答案

您可以让读者线程偶尔检查队列大小(比如每 1000 个项目),然后发布 std::atomic<int> qsize (带有 mo_relaxed 存储)第三个线程可以读取。

使用读取器专用的非原子计数器。读者递减它,并在它达到零时将其重置为 1000 + 发布。将它保存在作者不接触的缓存行中,因此根本没有额外的争用,除了每第 1000 个项目你做一个需要 RFO 才能将值提交到缓存行的存储。但它是只写存储,而不是 RMW,因此存储缓冲区有望隐藏延迟。 (除了在 x86 上,下一个原子 RMW 总是一个完整的障碍,所以它必须等待那个存储提交。但它只是每 1000 个出队操作,所以它几乎不会再减慢阅读器的速度。)

有一个 std::atomic<int>读者和作者原子地增加/减少将使他们比 SPSC 队列更多地相互竞争。没有竞争锁那么糟糕,但我预计它会比我建议的更糟糕。


发生的事情的细节可能取决于编译器为目标机器生成的 asm,以及它可以执行什么样的运行时重新排序。我不知道,但如果文档说它不受支持,那么如果您想冒险,就必须进行调查或试验。

大概调用 read_available()出于某种原因,当读取器正在使元素出队时并不安全。

您必须查看实现,看看这是否意味着可能减少一个或全部垃圾。

关于c++ - 我可以从第三个线程监控 boost::lockfree::spsc_queue 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52288575/

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