Skip to content

无锁进展

Lock-free progress · Lock-freedom

系统整体保证在有限步内有某个操作完成,而不保证指定线程。

条目类型
定义

形式陈述

并发对象实现称为 lock-free,若在任意含未完成调用、且对象操作步骤持续发生的无限执行中,都有无穷多个方法调用完成。常见的局部表述是:只要当前存在 pending 操作且系统继续执行对象步骤,从执行的任意时刻起,经过有限多个系统步骤总有某个 pending 操作完成。它是系统整体进展保证,而不是指定操作的等待上界。

直觉

lock-free 是执行级而非单线程级保证:在任何持续有步骤发生的无限执行中,系统必须不断完成操作。某线程的 CAS 失败通常证明共享状态已被别人成功改变,这可作为“失败也见证全局进展”的摊还论证。它避免持锁者暂停导致全体冻结,但不控制哪一个请求获益,也不提供固定步数或延迟上界。

例子与边界

CAS 循环中,一个线程可能每次比较交换前都被其他线程抢先修改而无限重试;只要那些修改对应操作不断完成,算法仍可 lock-free。它因此不能推出个体无饥饿,也不能给指定调用提供步骤上界。

Treiber 栈的 push 读取栈顶、构造新节点并 CAS;若 CAS 失败,说明某次并发修改已在线性化点成功,线程可重读重试。一个恶意调度可让同一线程每次都在 CAS 前被抢先,永不完成而系统仍 lock-free。若所有线程在内存回收协议上相互等待,核心 CAS 算法无锁也不足以让完整实现 lock-free;hazard pointer 或 epoch 回收的进展性质必须一并分析。

推论与应用

lock-free 是安全性与活性中的系统级活性保证:无限执行中总有某个操作完成,但不保证指定线程完成;线性化点等安全证明仍需另行给出。

共享内存中的原子读改写常实现 lock-free 对象,正确性还需与线性一致性分开证明。标准非阻塞层级为 wait-free 强于 lock-free,lock-free 强于obstruction-free;相邻页面分别给出个体有限步骤与 solo-termination 的量词,本页只刻画系统级持续完成。

无锁队列、栈和哈希表需要把算法重试、调度公平与内存回收组合成端到端进展论证。核心 CAS 循环满足 lock-free,不代表分配器或回收协议阻塞时公开方法仍满足该性质。

参考资料
  • Maurice Herlihy and Nir Shavit, The Art of Multiprocessor Programming, rev. 1st ed., Morgan Kaufmann, 2012,Ch. 3。
  • Hagit Attiya and Jennifer Welch, Distributed Computing: Fundamentals, Simulations, and Advanced Topics, 2nd ed., Wiley, 2004,Chs. 3–4。
关系图谱6 个相邻概念 · 3 类关系

拖动节点调整位置。

显示关系

显示:依赖

  1. 前置三跳
  2. 前置二跳
  3. 前置一跳
  4. 当前条目
  5. 后续一跳
  6. 后续二跳
  7. 后续三跳
文字版关系按与当前条目的最短距离分组
分类位置

上位 / 更一般

下位 / 直接特例

类型化关系