> For the complete documentation index, see [llms.txt](https://wtifs.gitbook.io/diva-notes/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://wtifs.gitbook.io/diva-notes/data-structure/suo.md).

# 锁

## 自旋锁

* 拿不到锁就一直死循环拿，不会休眠，比较耗CPU
* 其它锁都是 "申请不到就通知操作系统"：资源不足，我没法干活了，申请休息。于是操作系统暂停当前进程并将其置于等待/休眠队列，腾出它的CPU给其它进/线程使用；直到另外一个进程释放锁、它才可以再次得到执行机会。

## 互斥锁

同时只允许一个访问，无论读写。

用一个 `automic` 变量标识锁状态即可实现。

## 读写锁/可重入锁

同时只允许一个修改、但可以允许许多个读取（读取时不得写入）。适用于读多写少的场景。

实现需要用2个 `automic` 变量，一个表示读锁，一个表示写锁。

写锁用上面的互斥锁实现。另外加写锁时 CAS 修改读锁为负数，保证写时没有读者，也保证写期间无法读。

读锁就 CAS 给读变量加1 就可以了，加完判断下是否为负值，复值表示有写正在操作，读加锁失败。

## 条件锁

进程执行 "等待条件变量" 系统调用、然后因条件得不到满足而被操作系统自动挂起。等条件满足了，操作系统才会让其继续执行
