semaphore(信号量), event(事件), lock/mutex(锁), condition的区别
semaphore(信号量), event(事件), lock/mutex(锁), condition的区别
semaphore: 标记是否存在可用资源
- 没有所属概念,使用较为随意
- 在使用过程中,由于较为随意,所以容易出现一些问题:
- 意外释放: A和B都打算使用同一个信号量,但是在编写B的过程中,忘记申请信号,直接释放
- 递归死锁: A申请了信号,A的子程序仍然要继续申请
- 任务死亡导致死锁: A申请到了信号,但是没有释放就挂了
- 优先级反转: A和C都需要信号量,此时C申请到了信号。但是A优先级高于C,所以A抢占C,但因为需要信号,所以重新调用C,A阻塞。而此时B优先级高于C,低于A,会抢占C
- 信号量更多用于同步(通知某一方可以执行)
lock/mutex(MUTual EXclusion): 标记某方是否可以申请相关资源
- 有所属概念,谁拥有,谁释放。相当于对semaphore添加了一些使用规则,相较于semaphore更安全
- 不同的系统实现不同,因此对于semaphore中出现的问题,解决的力度也不一样
- 锁更多用于保护资源,防止不一致
condition: 当满足一定条件,则通知相关方可以申请lock/mutex
event: 标记某件事情的发生,所需方可以进一步操作。其可看做是信号量的进一步发展
参考资料
信号量 互斥锁 条件变量的区别
临界区,互斥量,信号量,事件的区别
Difference between binary semaphore and mutex
What is mutex and semaphore in Java ? What is the main difference?
Lock, mutex, semaphore… what’s the difference?
Mutex vs. Semaphores – Part 1: Semaphores
Mutex vs. Semaphores – Part 2: The Mutex