Skip to content

定义Definition

无锁进展

施工中 · 内容逐步修订

Lock-free progress · Lock-freedom

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

形式陈述 ​

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

直觉

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

例子与边界

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

Treiber栈的push读取栈顶、构造新节点并CAS;若CAS失败,说明某次并发修改已在线性化点成功,线程可重读重试。一个恶意调度可让同一线程每次都在CAS前被抢先,永不完成而系统仍lock-free。消除回退栈还可让重叠push/pop配对而不修改中央栈顶,但配对与超时撤回应竞争同一个单次状态决断,不能失败后再重复执行中央操作。

内存回收的进展也必须计入。Hazard Pointer通过固定槽持续保护具体地址;epoch回收则等待旧活跃区间结束,一个暂停的旧epoch读者可能阻止后续批次释放。核心CAS循环无锁,并不足以推出内存耗尽后仍能分配和完成方法。

推论与应用

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。
关系图谱16 个相邻概念 · 3 类关系

拖动节点调整位置。

显示关系

显示:依赖

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

上位 / 更一般

下位 / 直接特例

类型化关系