在Folly的无锁SPSC队列

时间:2016-03-22 15:57:03

标签: c++ multithreading c++11 atomic lock-free

在尝试理解如何处理无锁代码的过程中,我尝试编写单个使用者/单生产者锁定免费队列。和往常一样,我检查了论文,文章和代码,特别是考虑到这是一个有点微妙的主题。

所以,我偶然发现了Folly库中这个数据结构的实现,可以在这里找到: https://github.com/facebook/folly/blob/master/folly/ProducerConsumerQueue.h

正如我看到的每个无锁队列,这个似乎使用循环缓冲区,因此我们得到两个std::atomic<unsigned int>变量:readIndex_writeIndex_readIndex_表示我们将读取的下一个索引,writeIndex_表示我们将编写的下一个索引。看起来很简单。

所以,实现看起来干净而且非常简单,但我发现有一件事很麻烦。实际上,isEmpty()isFull()guessSize()等一些函数正在使用std::memory_order_consume来检索索引的值。

公平地说,我真的不知道他们的目的是什么。不要误解我的意思,我知道在通过原子指针进行依赖的经典案例中使用std::memory_order_consume,但在这里,我们似乎没有任何依赖!我们只得到索引,无符号整数,我们不创建依赖项。对于我,在这种情况下,std::memory_order_relaxed是等效的。

但是,我不相信自己比设计此代码的人更了解内存排序,因此我在这里问这个问题。有什么我错过或误解了吗?

我提前感谢你的答案!

0 个答案:

没有答案