我正在阅读Anthony Williams 的C++ Concurrency in Action。目前我在他描述memory_order_consume的地方。
在那个块之后有:
现在我已经介绍了内存排序的基础知识,是时候看看更复杂的部分了
这让我有点害怕,因为我不完全理解几件事:
之前的依赖排序与同步有什么不同?他们都创造了“事前发生”的关系。确切的区别是什么?
我对以下示例感到困惑:
int global_data[]={ … };
std::atomic<int> index;
void f()
{
int i=index.load(std::memory_order_consume);
do_something_with(global_data[std::kill_dependency(i)]);
}
kill_dependency 到底是做什么的?它杀死了哪个依赖?哪些实体之间?以及编译器如何利用这些知识?
memory_order_consume 的所有出现都可以安全地替换为 memory_order_acquire 吗?即它在所有意义上都更严格吗?
在代码清单 5.9 中,我可以安全地替换吗
std::atomic<int> data[5]; // all accesses are relaxed
和
int data[5]
? 即获取和释放可以用来同步访问非原子数据吗?
他通过一些小隔间里的男人的例子来描述放松、获得和释放。seq_cst和consume有没有类似的简单描述?