锁
自旋锁
拿不到锁就一直死循环拿,不会休眠,比较耗CPU
其它锁都是 "申请不到就通知操作系统":资源不足,我没法干活了,申请休息。于是操作系统暂停当前进程并将其置于等待/休眠队列,腾出它的CPU给其它进/线程使用;直到另外一个进程释放锁、它才可以再次得到执行机会。
互斥锁
同时只允许一个访问,无论读写。
用一个 automic
变量标识锁状态即可实现。
读写锁/可重入锁
同时只允许一个修改、但可以允许许多个读取(读取时不得写入)。适用于读多写少的场景。
实现需要用2个 automic
变量,一个表示读锁,一个表示写锁。
写锁用上面的互斥锁实现。另外加写锁时 CAS 修改读锁为负数,保证写时没有读者,也保证写期间无法读。
读锁就 CAS 给读变量加1 就可以了,加完判断下是否为负值,复值表示有写正在操作,读加锁失败。
条件锁
进程执行 "等待条件变量" 系统调用、然后因条件得不到满足而被操作系统自动挂起。等条件满足了,操作系统才会让其继续执行
Last updated