我试图通过以下简单的示例来理解指令的重新排序:
int a;
int b;
void foo(){
a = 1;
b = 1;
}
void bar(){
while(b == 0) continue;
assert(a == 1);
}众所周知,在本例中,如果一个线程执行foo,另一个线程执行bar,断言可能会失败。但我不明白为什么。我咨询了英特尔手册第3A卷8.2.2,发现了以下内容:
对内存的写入不会与其他写入重新排序,但有以下例外: -用非时间移动指令(MOVNTI、MOVNTQ、MOVNTDQ、MOVNTPS和MOVNTPD)执行流存储(写); -字符串操作(见8.2.4.1节)。
这里没有字符串操作,正如我没有注意到NT移动指令一样。所以..。为什么可以对写进行重新排序?
还是记忆在
写入内存的没有重新排序。
?因此,当我们将a和b缓存和写入时,不会发生在主内存中,而是会发生在缓存中。
发布于 2018-08-08 11:45:53
如果一个线程正在运行foo,另一个线程正在运行bar,那么程序的行为将是未定义的。
不允许对非原子变量(如int )同时进行读和写。
因此,在这种情况下,指令重排序是允许的。
https://stackoverflow.com/questions/51745856
复制相似问题