- 论坛徽章:
- 0
|
这两天在研究mutex实现时, 发现其中优化路径用了一种叫MCS自旋锁的方案.
MCS自旋锁, 顾名思义, 也是自旋锁的一种实现方式, 不过它的实现方式, 相当巧妙,
可以避免"cpu cacheline bouncing"的问题. 这一问题, 在常规的自旋锁实现方案中,
是一个比较严重的问题, 尤其在锁竞争激烈的时候.
此外, mutex实现用的自旋锁是一种增强版的叫可取消的MCS自旋锁. 也就是在
自旋等待过程中, 可以放弃等待. 这听起来似乎没什么, 不就停止循环吗? 但是, 基于
MCS自旋锁的独特实现方式, 即基于链表的方式, 这种放弃等待, 就不是简单的停止循环了.
这相当于一个链表元素的脱链操作. 这就要考虑到并发问题. 而代码实现中, 是不用锁来
解决并发的. 而是用了原子交换等原语. 所以, 看MCS自旋锁的实现, 会发现这种锁的实现中,
展示了另一种技术, 即无锁并发编程的技术.
这种编程需要极小心来规避并发带来的问题, 因此代码阅读起来有些晦涩, 但又十分刺激.
这个周末分析了下代码, 并写了两篇文章来记录下自己的理解 . 顺便与大家分享.
本来是想原文粘贴在这里, 不过发现惨不忍睹. 所以还是贴我博客链接吧, 顺便为博客带点人气 
如有疏漏谬误, 也麻烦指正.
Linux同步机制--MCS自旋锁
Linux同步机制--可取消的MCS自旋锁
|
|