posts - 225, comments - 62, trackbacks - 0, articles - 0
   :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

mutex & memory fence

Posted on 2014-12-01 13:53 魔のkyo 阅读(479) 评论(1)  编辑 收藏 引用 所属分类: Programming
mutex其实除了锁住数据只被一个线程同时访问,还隐含了__sync_synchronize() (大概意思是多核的时候保证每个核的cache都和mem同步了)

一个例子:
Processor #1:

while (f == 0);

// Memory fence required here

print x;


Processor #2:
x = 42;

// Memory fence required here

f = 1;

上面的例子中,变量 x f 初始化值都是0。我们期望输出“42”。但是结果并不总是这样。
如果存储操作是乱序的,我觉得实际上并不是说上面的语句执行顺序颠倒,而可能是Processor #2上包含了f的那块cache比包含了x的那块cache先和mem进行了同步,这样的结果对于Processor #1来说,就相当于对f赋值的语句先于对x赋值的语句,那么就有会输出“0”
在注释的地方加入__sync_synchronize()语句就可以解决这个问题,确保输出“42”。
我们之所以从来没关心过这个问题,是因为对于类似上面的代码,我们一般会用mutex对f和x的访问进行加锁,而mutex隐含了__sync_synchronize()。

参考

Feedback

# re: mutex & memory fence  回复  更多评论   

2015-03-17 15:50 by leeco
如果使用volatile关键字修饰变量,也可以告诉编译器这是一个多线程访问的变量,那么它会处理成每次都要去内存上读取变量的值而不使用缓存的。
只有注册用户登录后才能发表评论。