无锁队列,支持一个读线程和一个写线程
设计思想:
队列预先分配,通过std::atomic类型的readIndex和writeIndex来标识读和写的位置,然后通过原子操作这两个索引,可以实现不加锁的目的
核心代码如下:
template<class...Args>
bool write(Args&&... recordArgs) {
auto const currentWrite =writeIndex_.load(std::memory_order_relaxed);
auto nextRecord =currentWrite + 1; //因为只有一个写线程,所以这里不会冲突
if (nextRecord == size_) {
nextRecord = 0;
}
// 读写线程冲突的地方,readIndex.load确保看到写线程里的readIndex值
if (nextRecord !=readIndex_.load(std::memory_order_acquire)) {
new (&records_[currentWrite])T(std::forward<Args>(recordArgs)...);
//确保写到writeIndex里的值可以被读线程看到
writeIndex_.store(nextRecord,std::memory_order_release);
return true;
}
// queue is full
return false;
}
// move (or copy) the value at the front ofthe queue to given variable
bool read(T& record) {
auto const currentRead =readIndex_.load(std::memory

本文深入探讨了Folly库中的ProducerConsumerQueue实现,它是一个专为单读线程和单写线程设计的无锁队列。通过预分配队列空间并利用std::atomic进行读写索引的原子操作,从而达到无锁的效果。核心代码是关键实现部分。
974

被折叠的 条评论
为什么被折叠?



