Hei*_*Hei 4 multithreading boost g++ lock-free c++11
我正在查看Boost 的 lockfree queue。
当生产者线程将数据结构 T 推入缓冲区时,它会(通过复制构造函数)将数据复制到缓冲区中。
当消费者线程尝试调用consume_one() 来读取缓冲区中的元素时,似乎需要一个内存屏障?如果没有,生产者线程所做的更改怎么可能对消费者线程可见?
谢谢!
一个额外的不需要内存屏障。
当使用内存顺序获取读取索引并使用释放内存顺序写入索引时,队列工作正常:http : //en.cppreference.com/w/cpp/atomic/memory_order
如您所见,也无需担心对实际元素数据的写入,因为索引更新(在复制之后完成)发生在读取之前。
由于使用 SPSC 队列的文档要求明确指出消费者和生产者将始终是相同的、单一的线程,因此所有“本地”索引操作都是以“宽松”的内存顺序完成的。
请注意,唯一与此不同的操作是reset(),它类似于构造/销毁,不是线程安全的。
对于内存顺序的背景知识,我推荐 Anthony William 的优秀书籍C++ Concurrency In Action