Skip to content

模型Model

互斥锁

Mutex · Mutex lock · 互斥量

以获取、释放与所有权封装临界区互斥的同步对象。

形式陈述 ​

互斥锁把互斥这一安全规格实现为一个可调用的同步对象。对线程集合 P,最小抽象状态可写成

M∈{unlocked}∪{owned(i):i∈P}.

线程 i 调用 lock_i 时,若 M=unlocked,操作把状态原子地改为 owned(i) 并成功返回;否则调用保持未完成,直到实现允许它取得锁。unlock_i 把 owned(i) 改回 unlocked。在带所有者检查的接口中,i≠j 时由线程 j 对 owned(i) 执行 unlock_j 是非法操作。可选的 try_lock_i 只尝试一次:锁空闲时取得所有权,否则返回失败而不等待。

成功 lock 的线性化点是所有权从空闲转给调用者的原子时刻;unlock 的线性化点是所有权被释放的时刻。由状态唯一性立即得到互斥不变量:任何可达状态至多有一个所有者。但这项安全性不推出任何进展结论。若持锁者停止、等待者永远不被选择,或者多把锁形成循环等待,互斥仍可能始终成立,而系统已经失去活性。

递归锁是否允许同一线程重复获取、非所有者释放如何处理、等待队列是否 FIFO,以及是否提供有界等待,都是具体接口的契约,不属于“mutex”一词自动携带的性质。普通 mutex 通常是阻塞式的:获取失败的线程进入等待状态,由调度器转去运行别的线程;“失败后继续占用处理器轮询”则是自旋锁的实现语义。

在语言或硬件提供的同步接口中,成功获取通常具有 acquire 语义,释放通常具有 release 语义。于是同一把锁上先前 release 与随后成功 acquire 之间可建立可见性顺序;确切的读写可见范围仍由目标内存一致性模型规定,不能仅凭“使用了锁”跨语言推导统一的 happens-before 规则。

直觉

互斥锁把“至多一个线程进入”落实为所有权转移。调用 lock 只表示提出请求,成功返回才表示取得所有权;被唤醒也可能只表示可以再次竞争,不能未经重新获取就访问受保护状态。释放则结束本次所有权,不一定把锁直接交给队列最前面的线程,除非具体接口保证这种交接。

抽象状态里的 owned(i) 足以描述互斥安全性,却不足以描述 FIFO 公平性。要证明后来的请求不插队,还需记录等待队列、入队次序与选择规则。把这些状态省略是安全规格的抽象,不是已经证明所有等待者都会获锁。

可睡眠 mutex 适合临界区可能持续较久的场景。线程发现锁已占用后暂停,CPU 可以执行持锁者或其他任务;代价是入队、调度和唤醒可能比短临界区本身更贵。是否值得阻塞取决于等待时长、调度成本与运行环境,而不是由“mutex 比 spinlock 高级”这样的标签决定。

例子与边界

设多个工作线程更新同一张内存索引。每个线程先 lock(m),在临界区内同时修改索引表和元素计数,最后 unlock(m)。锁的互斥性排除了两个更新在中途交错;若释放与获取具有相应内存序,后继持锁者也能观察前任完成的修改。这里仍需保证所有访问都遵守同一同步协议:某条旁路代码若不加锁直接写计数,整个程序依然可能产生数据竞争或破坏索引不变量。

持锁线程在临界区内永久崩溃时,状态可能永远停在 owned(i)。其他线程继续正确调用 lock,却都无法完成;互斥安全性没有被破坏,进展性已经丧失。某些系统提供 robust mutex 或外部恢复协议来识别失主并修复共享状态,但那是额外的故障模型与恢复机制,不能算作普通锁的固有保证。

即使每个线程都持续运行,也不自动排除饥饿:A 释放后立即重新竞争并每次成功,B 每次获得 CPU 时都见到锁已被占用。两者都取了无穷多步,系统也不断完成临界区,B 却从未取得所有权。因此进程公平调度、锁的公平授予和单次临界区最终退出是三个不同条件。

初值为一的二元信号量也能把并发进入数限制为一,却通常不记录“哪个线程拥有许可”:一个线程可以等待,另一个线程可以发出许可。这使它适合事件交接,却不自动具有 mutex 的所有者检查、递归约定或优先级继承语义。两者产生相似的容量效果,不代表接口可以无条件互换。

推论与应用

互斥锁把抽象安全条件连接到操作系统与语言的同步 API。条件变量依靠 mutex 在检查共享谓词与进入等待之间关闭丢失唤醒窗口;monitor 再把锁、条件队列和受保护状态封装在同一模块中。多把锁组合时,还需用固定锁序、一次性获取或检测恢复来处理死锁,并单独检查公平与饥饿。

性能分析也必须落在实际竞争形态上:临界区长度、持锁者是否可能被抢占、等待者数量和缓存流量共同决定成本。锁粒度过粗会压低并发度,过细则增加协调次数并放大组合错误;两种选择都不改变 mutex 的抽象状态机,只改变程序建立更大不变量的方式。

基本优先级继承把持锁者被抢占这一成本具体化:等待者沿当前锁所有者链传递有效优先级,交接、取消及多锁释放后重新核对捐赠来源。它可以排除无关中间优先级工作的插队,但互斥所有权、死锁预防和业务回滚仍有各自的条件。

参考资料
关系图谱12 个相邻概念 · 5 类关系

拖动节点调整位置。

显示关系

显示:依赖

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

上位 / 更一般

暂未标注直接上位概念。

下位 / 直接特例

类型化关系