IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

lock free的理解

isnowfy 2014-04-21 12:45:28 累计浏览 3,338 次
本机暂存

its-lock-free

以前一直不明白lock free是什么,后来发现原来是完全理解错了概念,lock free看到大家有的翻译为无锁,有的翻译为锁无关,其实用不用锁和lock free是不相关的,用了锁也可能是lock free,而不用锁有可能不是lock free。

一个lock free的解释是

一个“锁无关”的程序能够确保执行它的所有线程中至少有一个能够继续往下执行。

其实看我们那副图就是说你的各个线程不会互相阻塞,那么你的程序才能成为lock free的。像我们平常用的互斥锁,当有线程获得锁,其他线程就被阻塞掉了,这里的问题就是如果获得锁的线程挂掉了,而且锁也没有释放,那么整个程序其实就被block在那了,而如果程序是lock free的那么即使有线程挂掉,也不影响整个程序继续向下进行,也就是系统在整体上而言是一直前进的。

那么,不用锁就是lock free的吗,一开始就提到了,不用锁也可能不是lock free的,举个例子

  1. while (x == 0) {
  2. x = 1-x;
  3. }

在这里如果两个线程同时执行,可能同时进入while循环,然后x两次改变值之后,依然是0,那么两个线程就会一直互相在这里阻塞掉了,所以这里虽然没有锁,依然不是lock free的。

现在大家写lock free的时候一般都会使用CAS(compare and set)操作来写,因为现在很多的cpu都是支持CAS操作并作为原子操作来处理的,CAS操作一般是这样的

  1. bool compare_and_swap (int *oldval, int *dest, int newval) {
  2.  if (*oldval == *dest) {
  3.  *dest = newval;
  4.  return true;
  5.  }
  6.  return false;
  7. }

其实这样一个操作和乐观锁很像,并且操作简单,相应的比互斥锁的代价要小。所以现在大家都是喜欢用lock free的技术来提高系统的performance。

最后如果大家对于如何编写lock free的数据结构感兴趣的话,可以参考我后面给出的链接。

一种高效无锁内存队列的实现
无锁队列的实现
锁无关的(Lock-Free)数据结构
An Introduction to Lock-Free Programming

同分类推荐文章

  1. 对基本有序的序列排序算法 (2026-06-11 17:46:49)
  2. Four Levels Of Customer Understanding (2026-05-22 21:00:00)
  3. 除法的意义 (2026-04-12 20:52:17)

查看更多 算法 文章 →

建议继续学习

  1. 一种常见的并发编程场景的处理 (累计阅读 23,588)
  2. 无锁消息队列 (累计阅读 14,276)
  3. 一种高效无锁内存队列的实现 (累计阅读 12,095)
  4. 大并发下的高性能编程 – 改进的(用户态)自旋锁 (累计阅读 9,042)
  5. TT的作者出新作品鸟:kyoto tycoon (累计阅读 7,953)
  6. 多线程队列的算法优化 (累计阅读 7,732)
  7. 程序中的“多线程” (累计阅读 7,323)
  8. 并发框架Disruptor译文 (累计阅读 6,761)
  9. 无锁HashMap的原理与实现 (累计阅读 6,744)
  10. php多线程扩展 (累计阅读 5,471)