首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >内存屏障/栅栏如何抑制CPU执行指令重排序?

内存屏障/栅栏如何抑制CPU执行指令重排序?
EN

Stack Overflow用户
提问于 2015-12-23 10:48:41
回答 1查看 603关注 0票数 2

据我所知,编译器和CPU都可以执行指令重排序。所谓“由CPU执行”,我的意思是我不关心由编译器完成的指令重新排序,以及由存储缓冲区和CPU缓存引起的重新排序。对于由存储缓冲区和CPU缓存引起的重新排序(这在文章中已经讨论过),我已经了解了内存屏障如何阻止这种重新排序(内存重新排序)。

我在乎的是这样的重新排序:

源代码:

代码语言:javascript
复制
data=1; //statement1
ready=true;//statement2

但是,运行在ThreadA上的CPU0按照以下顺序执行上述代码:

代码语言:javascript
复制
ready=true;//statement2
data=1; //statement1

也就是说,CPU重新排序指令,这将导致实际执行顺序与源代码指定的顺序不同。正如我们所知道的,如果我们想要保持源代码的顺序,我们可以求助于内存屏障(或栅栏),如:

新的源代码:

代码语言:javascript
复制
data=1; //statement1
smp_wb();//Insert a write barrier here!
ready=true;//statement2

所以我的问题来了:记忆障碍是如何抑制指令重排的?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-14 10:53:35

@Tsyvarev是正确的,它是处理器(或处理器族)特定的。例如,在ARM下,DMB(内存屏障)会导致CPU管道的阻塞,以确保排序(防止重新排序),正如其文档所述:

图1显示了用于通过延迟管道来确保内存排序的DMB指令。

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

https://stackoverflow.com/questions/34433941

复制
相关文章

相似问题

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