gpt4 book ai didi

multithreading - 使用 boost::lockfree::spsc_queue 时需要内存屏障吗?

转载 作者:行者123 更新时间:2023-12-04 00:24:04 25 4
gpt4 key购买 nike

我在看 Boost's lockfree queue .

当生产者线程将数据结构 T 插入缓冲区时,它会(通过复制构造函数)将数据复制到缓冲区中。

当消费者线程尝试调用consume_one() 来读取缓冲区中的元素时,似乎需要一个内存屏障?如果没有,生产者线程所做的更改怎么可能对消费者线程可见?

谢谢!

最佳答案

不需要额外的内存屏障。

当使用内存顺序获取读取索引并使用释放内存顺序写入索引时,队列工作正常:http://en.cppreference.com/w/cpp/atomic/memory_order

  • 获取:具有此内存顺序的加载操作对受影响的内存位置执行获取操作:执行释放的线程对其他内存位置进行的先前写入在该线程中变得可见。
  • 释放:具有此内存顺序的存储操作执行释放操作:对其他内存位置的先前写入对在同一位置执行消耗或获取的线程可见

  • 如您所见,也无需担心对实际元素数据的写入,因为索引更新(在复制之后完成)发生在读取之前。

    由于使用 SPSC 队列的文档要求明确指出消费者和生产者将始终是相同的、单一的线程,因此所有“本地”索引操作都是以“宽松”的内存顺序完成的。

    请注意,唯一偏离此操作的是 reset() , 类似于 build /破坏,是 不是 线程安全。

    对于内存顺序的背景知识,我推荐 Anthony William 的好书 C++ Concurrency In Action

    关于multithreading - 使用 boost::lockfree::spsc_queue 时需要内存屏障吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26571745/

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