死锁 (Deadlock)

A deadlock is a state in which each member of a group is waiting for another member, including itself, to take action.

出现线程 “互相等待” 的情况

AA-Deadlock

Model checker 可以告诉你为什么

lock(&lk);
// lk = LOCKED;
lock(&lk);
// while (xchg(&lk, LOCKED) == LOCKED) ;

看起来很傻,你觉得自己不会犯这错误?

  • 不,你会犯的!
  • 真实系统的复杂性等着你
    • 多层函数调用
    • 隐藏的控制流

ABBA-Deadlock

哲 ♂ 学家吃饭问题

void Tphilosopher() {
  P(&avail[lhs]);
  P(&avail[rhs]);
  // ...
  V(&avail[lhs]);
  V(&avail[rhs]);
}
  • $T_1$: P(1) - 成功, P(2) - 等待
  • $T_2$: P(2) - 成功, P(3) - 等待
  • $T_3$: P(3) - 成功, P(4) - 等待
  • $T_4$: P(4) - 成功, P(5) - 等待
  • $T_5$: P(5) - 成功, P(1) - 等待

死锁产生的必要条件

System deadlocks (1971):死锁产生的四个必要条件

  • 用 “资源” 来描述
    • 状态机视角:就是 “当前状态下持有的锁 (校园卡/球)”

  1. Mutual-exclusion - 一张校园卡只能被一个人拥有
  2. Wait-for - 一个人等其他校园卡时,不会释放已有的校园卡
  3. No-preemption - 不能抢夺他人的校园卡
  4. Circular-chain - 形成校园卡的循环等待关系

四个条件 “缺一不可”

  • 打破任何一个即可避免死锁
  • 在程序逻辑正确的前提下 “打破” 根本没那么容易……