gpt4 book ai didi

C++ memory_order_consume, kill_dependency, dependency-ordered-before, 同步

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:14:59 27 4
gpt4 key购买 nike

我正在阅读 C++ Concurrency in Action安东尼·威廉姆斯。目前我在他描述 memory_order_consume 的地方。

在那 block 之后有:

Now that I’ve covered the basics of the memory orderings, it’s time to look at the more complex parts

这让我有点害怕,因为我不完全理解几件事:


dependency-ordered-before 与 synchronizes-with 有何不同?他们都创建了先发生后发生的关系。确切的区别是什么?


我对以下示例感到困惑:

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? IE。它在所有意义上都更严格吗?


在 list 5.9 中,我可以安全地替换

std::atomic<int> data[5]; // all accesses are relaxed

int data[5]

? IE。 acquire 和 release 可以用来同步访问非原子数据吗?


他通过一些人在小隔间里的例子描述了放松、获取和释放。 seq_cst和consume有没有类似的简单描述?

最佳答案

至于倒数第二个问题,答案需要多解释一下。当多个线程访问相同的数据时,可能会出现三种错误:

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

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

  3. 处理器可能会在其本地缓存中保留一个值,而不会在更改值后更新主内存或在另一个线程更改主内存中的值后重新读取它。

内存顺序地址数字 3。原子函数地址 1 和 2,并且,根据内存顺序参数,也可能是 3。所以 memory_order_relaxed 的意思是“不要理会数字 3。代码仍然处理 1 和 2。在这种情况下,您将使用 acquire 和 release 来确保正确的内存排序。

关于C++ memory_order_consume, kill_dependency, dependency-ordered-before, 同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14779518/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com