小编Sid*_*cts的帖子

在Folly的无锁SPSC队列中使用std :: memory_order_consume

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

所以,我偶然发现了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在经典的依赖项中使用了一个原子指针,但是在这里,我们似乎没有任何依赖!我们只得到索引,无符号整数,我们不创建依赖项.在这种情况下,对我来说,a std::memory_order_relaxed是等价的.

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

我提前感谢你的答案!

c++ multithreading atomic lock-free c++11

8
推荐指数
1
解决办法
680
查看次数

标签 统计

atomic ×1

c++ ×1

c++11 ×1

lock-free ×1

multithreading ×1