semaphore(信号量), event(事件), lock/mutex(锁), condition的区别
程序员文章站
2022-08-12 14:10:20
初步区分和理解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