“固定异步共享内存模型:进程可能崩溃停止,正确进程持续取得步骤;实现可使用任意多个原子读写寄存器和某种线性一致的对象类型 $T$。$T$ 的共识数 $c(T)$ 定义为:能够用这些对象为 $n…”
形式陈述 ​
一个并发对象实现称为 wait-free,若对任意可容许执行、任意正确参与者
量词中的“自身步骤”把进展与现实时间分开。操作系统可以暂停
文献中“有界 wait-free”常强调存在统一函数
wait-free 蕴含lock-free:若每个持续取步骤的 pending 调用都能有限完成,那么系统持续执行对象步骤时必然不断有操作完成。逆命题不成立,因为系统级完成可以永远由其他线程贡献。两种进展条件都只讨论终止;对象返回值是否满足线性一致性或其他安全规格仍需独立证明。
帮助机制与 wait-free 并不矛盾。线程可以公开自己的操作描述,其他线程在更新共享状态时顺手替它完成;只要每个调用无论竞争怎样都在有限自身步骤内确认完成,这种协作反而是许多 wait-free 构造突破无限重试的关键。
直觉 ​
lock-free 像承诺“队伍一直有人办完业务”,wait-free 则给每位持续走到窗口前的顾客一张有限流程单:无论旁边的人多快、是否离场,这位顾客执行完有限步骤就会结束。它不承诺现实秒数,却不允许同一个人永远被抢先。
这种保证昂贵之处在于算法不能把完成希望寄托在某个特定同伴上。等待锁持有者、等待全体线程响应或使用可能无限失败的 CAS 循环,都需要额外结构才能提升为 wait-free;常见代价是复制操作描述、帮助其他请求或维护更多版本。
例子与边界 ​
在固定
CAS 计数器采用 read; CAS(old, old+1); retry。每次 CAS 失败都说明某个竞争者修改了值,所以系统可能一直完成递增,满足 lock-free;恶意调度却可让线程
等待一把 mutex 的操作也不是 wait-free。持锁线程暂停后,等待者执行再多自身检查都无法完成。robust lock 能处理某些持有者故障,公平锁能排除某些插队,它们仍以其他线程释放或恢复为前提,与“独立于他人速度”的量词不同。
推论与应用 ​
wait-free 是非阻塞进展层级中强而清晰的个体保证,适合实时控制路径、故障隔离和共享内存可计算性研究。Herlihy 的共识层级用“对象类型能为多少进程 wait-free 地解决共识”衡量同步能力;这里比较的是可实现性,不是硬件指令吞吐排名。
完整系统的端到端性质取决于所有组成部分。核心数据结构即使 wait-free,动态内存分配、内存回收或回调若会阻塞,公开操作就未必 wait-free。证明必须覆盖调用路径实际依赖的组件,并明确调度公平只要求调用线程自身持续取步骤,而非让算法借公平性掩盖无限内部重试。
参考资料
- Maurice Herlihy, “Wait-Free Synchronization,” ACM Transactions on Programming Languages and Systems 13(1), 1991, pp. 124–149。
- Maurice Herlihy and Nir Shavit, The Art of Multiprocessor Programming, rev. 1st ed., Morgan Kaufmann, 2012,Chs. 3, 4, 5。
- Afek et al., “Atomic Snapshots of Shared Memory,” Journal of the ACM 40(4), 1993, pp. 873–890。