gpt4 book ai didi

C++11 内存模型 : why can't compiler move statements across load() operations during optimization?

转载 作者:搜寻专家 更新时间:2023-10-31 01:41:11 27 4
gpt4 key购买 nike

据我了解,对于顺序一致和获取释放内存模型,如果一些 x.store(some_value)来自一个线程的操作与 x.load() 同步从另一个操作,然后:

规则 1. 在 x.store(some_value) 之前发生的所有内存操作操作必须出现在 x.load() 之前操作。

这一点对我来说似乎很清楚:

-Thread 1-        
y = 1;
x.store(2, memory_order_release);

-Thread 2-
if (x.load(memory_order_acquire) == 2)
assert(y == 1)

这里如果编译器放置y = 1 x.store(2) 之后的操作, assert可能会失败,这不是我们期望的行为。

规则 2. 在 x.load() 之后发生的所有内存操作操作也必须出现在 x.store(some_value) 之后操作。

但现在我很困惑:为什么编译器不能将语句移动到 load() 中?操作?它怎么会违反程序的预期行为呢?我想到了这样一个例子:

-Thread 1-        
x.store(2, memory_order_release); // x == 0 initially

-Thread 2-
while (x.load(memory_order_acquire) == 1);
y = 2; // y == 0 initially

在这里,如果编译器放置y = 2 while()之前的操作, y变成 2 (否则会出现无限循环并且 y 保持不变),但这个示例似乎是强制性的(我什至不确定编译器是否可以进行此类“优化”),我怀疑规则 2 有更现实的情况被创建。

能否请您解释一下规则 2 的必要性?

最佳答案

如果可以将加载之后的操作移到加载之前,则线程 2 中的 assert(y == 1) 可以在线程中的 y = 1 之前发生1,即使(根据规则 1)赋值发生在存储之前。只有这两个规则一起才能确保这两个语句以正确的顺序执行。

关于C++11 内存模型 : why can't compiler move statements across load() operations during optimization?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28789669/

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