首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >英特尔上的指令重排序

英特尔上的指令重排序
EN

Stack Overflow用户
提问于 2018-08-08 11:42:10
回答 1查看 394关注 0票数 3

我试图通过以下简单的示例来理解指令的重新排序:

代码语言:javascript
复制
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移动指令一样。所以..。为什么可以对写进行重新排序?

还是记忆在

写入内存的没有重新排序。

?因此,当我们将ab缓存和写入时,不会发生在主内存中,而是会发生在缓存中。

EN

回答 1

Stack Overflow用户

发布于 2018-08-08 11:45:53

如果一个线程正在运行foo,另一个线程正在运行bar,那么程序的行为将是未定义的。

不允许对非原子变量(如int )同时进行读和写。

因此,在这种情况下,指令重排序是允许的。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51745856

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档