-
互斥锁
- 对于互斥锁,有两种状态:加锁和解锁
- 互斥锁在访问共享资源之前进行加锁,在访问结束后进行解锁
- 加锁后,对于其他访问共享资源的线程,会被阻塞,直到解锁
- 阻塞后会立刻释放CPU资源
-
读写锁
- 读写锁相比于互斥锁有更多的加锁状态:读时加锁,写时加锁,不加锁
- 同时只能有一个线程占有写锁,但是可以有多个线程占用读锁(写只能一个,读可以多个)
- 如果有线程进行读操作,则允许其他线程也进行读操作,但是不可以写
- 如果有线程进行写操作,则不允许其他线程进行读操作和写操作
- 如果一个线程申请读锁,其他线程可以申请读锁,但不能申请写锁
- 如果一个线程申请写锁,其他线程不可以申请读锁和写锁
-
自旋锁
- 和互斥锁相同,但阻塞后不会释放CPU资源
- 自旋锁在内核态使用较多,主要用于锁的时间较短的时候
-
条件变量
- 条件变量用于自动阻塞一个线程,直到发生某一情况为止,通常与互斥锁一起使用
-
信号量
- 信号量广泛用于进程或线程间的同步和互斥,信号量本质上是一个非负的整数计数器,它被用来控制对公共资源的访问。
- 编程时可根据操作信号量值的结果判断是否对公共资源具有访问的权限,当信号量值大于 0 时,则可以访问,否则将阻塞。PV 原语是对信号量的操作,一次 P 操作使信号量减1,一次 V 操作使信号量加1。
Q.E.D.