Memory ordering & memory barrier

最近很惊异的发现(对称多处理器)ARM 架构的乱序执行技术对内存的读取/写入顺序几乎没有任何保证(嗯,我知道早就old了)。这方面 x86 架构好些,但也有一条:
Loads may be reordered with older stores to different locations.

于是第一想到的就是古董的 Peterson lock(这个现在一般是用来说明为何需要处理器加入 test-and-set 之类的指令),代码如下:

果不其然,不管是 ARM 还是 x86,只要是多核心的,程序都会生成错误结果。

补救的方法是使用 memory barrier(或者 memory fence)处理器指令来强制限制内存操作的顺序。在上面的程序中便是 lock 函数中注释掉的两行汇编代码,dmb 是 ARM 的指令,mfence 是 x86 的指令。

虽然 Peterson lock 早已成为遗迹,但现今也还有栽在这个 memory ordering 上的,比如 boost 库里存在了好几个版本的这个 bug

Advertisements
This entry was posted in Computer and Internet, Programming and Algorithm and tagged , . Bookmark the permalink.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s