Spinlock-Acquire与Release

自旋锁 (Spinlock) 适用于持有时间极短的场景。

Acquire (加锁)

void acquire(struct spinlock *lk) {
  push_off(); // 1. 关中断 (防止死锁)
  if(holding(lk)) panic("acquire"); // 禁止重入
 
  // 2. 原子操作抢锁
  while(__sync_lock_test_and_set(&lk->locked, 1) != 0)
    ; // 自旋 (Spinning): 这里的空循环在消耗 CPU
 
  // 3. 内存屏障
  __sync_synchronize(); 
}

Release (解锁)

void release(struct spinlock *lk) {
  // 1. 内存屏障
  __sync_synchronize();
 
  // 2. 原子释放 (可以直接写 0,因为我们拥有锁)
  __sync_lock_release(&lk->locked);
 
  pop_off(); // 3. 开中断
}