实现互斥:做题家 v.s. 科学家

void lock(lock_t *lk);
void unlock(lock_t *lk);

做题家:拿到题就开始排列组合

  • 熟练得让人心疼
    • 如果长久的训练都是 “必须在规定的时间内正确解出问题”,那么浪费时间的思考自然就少了

科学家:考虑更多更根本的问题

  • 我们可以设计出怎样的原子指令?
    • 它们的表达能力如何?
  • 计算机硬件可以提供比 “一次 load/store” 更强的原子性吗?
    • 如果硬件很困难,软件/编译器可以么?

自旋锁:用 xchg 实现互斥

在厕所门口放一个桌子 (共享变量)

  • 初始时放着 🔑

自旋锁 (Spin Lock)

  • 想上厕所的同学 (一条 xchg 指令)
    • Stop the world
    • 看一眼桌子上有什么 (🔑 或 🛑)
    • 把 🛑 放到桌上 (覆盖之前有的任何东西)
    • Resume the world
    • 期间看到 🔑 才可以进厕所,否则重复
  • 出厕所的同学
    • 把 🔑 放到桌上

实现互斥:自旋锁

int table = YES;

void lock() {
retry:
  int got = xchg(&table, NOPE);
  if (got == NOPE)
    goto retry;
  assert(got == YES);
}

void unlock() {
  xchg(&table, YES);  // 为什么不是 table = YES; ?
}

(在 model checker 中检查)

实现互斥:自旋锁

在 xchg 的假设下简化实现

  • 包含一个原子指令
  • 包含一个 compiler barrier
  • 包含一个 memory fence
    • sum-spinlock demo
int locked = 0;

void lock() {
  while (xchg(&locked, 1));
}

void unlock() {
  xchg(&locked, 0);
}