C++ memory_order_consume,kill_dependency,dependency-ordered-before,synchronize-with

qbl*_*ble 4 c++ atomic memory-model lock-free c++11

我正在阅读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)]);
}
Run Code Online (Sandbox Code Playgroud)

kill_dependency到底做了什么?它杀死了哪种依赖?哪个实体之间?编译器如何利用这种知识?


是否可以使用memory_order_acquire安全地替换memory_order_consume的所有事件?即各方面都更严格吗?


在代码清单5.9中,我可以安全地替换

std::atomic<int> data[5]; // all accesses are relaxed
Run Code Online (Sandbox Code Playgroud)

int data[5]
Run Code Online (Sandbox Code Playgroud)

?即可以获取和释放用于同步访问非原子数据?


他描述了轻松,获得和释放的一些例子与男人在小隔间.是否有一些类似的简单描述seq_cst和消费?

Pet*_*ker 5

至于下一个问题,答案需要更多解释.当多个线程访问相同的数据时,有三件事可能会出错:

  1. 系统可能会在读取或写入过程中切换线程,从而产生半个值和另一个值的结果.

  2. 编译器可能会移动代码,假设没有其他线程查看所涉及的数据.

  3. 处理器可以在其本地高速缓存中保持一个值,而不是在更改值之后更新主存储器或在另一个线程改变主存储器中的值之后重新读取它.

存储器顺序地址唯一编号3.原子功能地址1和2,并根据所述存储器顺序参数,也许3为好.所以memory_order_relaxed意味着"不要打扰3号.代码仍然处理1和2.在这种情况下,你将使用获取和释放来确保正确的内存排序.