- 论坛徽章:
- 0
|
本帖最后由 yiifburj 于 2014-06-01 21:26 编辑
linux内核文档 Documentation/memory-barriers.txt
锁暗含内存屏障, 和 smp_rmb smp_wmb不同
lock //lock之后的内存操作一定在lock之后开始,lock之前的内存操作可能在lock之后提交或完成
unlock //unlock之前的内存操作要在unlock之前完成,unlock之后的内存操作可能在unlock之前提交或完成
unlock 后面带一个 lock 相当于完全内存屏障的作用。smp_mb
lock code unlock 相当于限制code中的内存操作在lock后开始,unlock前完成,副作用,lock之前的内存操作在unlock之前一定会完成,只能越过lock不会越过unlock, unlock之后的内存操作一定在lock之后完成,只能越过unlock不能越过lock
所以对于锁保护的区间, 不需要内存屏障。
以上仅是个人理解,不保证正确性,内核文档可以好好读读。
我们公司的同事基本都是加锁,很少有人研究内存屏障, 实践表明应该是没有问题的, 忘记加锁,倒是出现过问题,就是一个添加链表,另一个恰好遍历到那个地方, 如果加了内存屏障,不加锁也不会出问题。不过这也是小概率时间,很不容易遇到。 |
|