<aside> 📖 实现互斥的根本困难:不能同时读/写共享内存

1. 自旋锁 Spin Lock


解决问题的两种方法:

  1. 提出算法、解决问题 (Dekker/Peterson/...'s Protocols)
  2. 改变假设 (软件不够,硬件来凑)

假设硬件能为我们提供一条 “瞬间完成” 的读 + 写指令。

X86 原子操作:LOCK 指令前缀

Atomic exchange (load + store)

int xchg(volatile int *addr, int newval) {
  int result;
  asm volatile ("lock xchg %0, %1"
    : "+m"(*addr), "=a"(result) : "1"(newval));
  return result;
}

在此基础上,我们就可以实现自旋锁:

int locked = 0;
void lock() { while (xchg(&locked, 1)) ; }
void unlock() { xchg(&locked, 0); }

原子指令

原子指令的模型:

现代的实现一般在 L1 cache 层保持一致性 (ring/mesh bus)

最早的原子指令:80486 的 Bus Lock

最早的原子指令:80486 的 Bus Lock

Load-Reserved/Store-Conditional (LR/SC)

常见原子操作的本质都是 load ⇒ exec ⇒ store 的序列

RISC-V 的实现方法:

用 LR/SC 实现 CAS: