自旋锁

  • 拿不到锁就一直死循环拿,不会休眠,比较耗CPU

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

互斥锁

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

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

读写锁/可重入锁

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

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

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

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

条件锁

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

Last updated