欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

semaphore(信号量), event(事件), lock/mutex(锁), condition的区别

程序员文章站 2022-04-13 10:31:16
初步区分和理解semaphore(信号量), event(事件), lock/mutex(锁), condition ......

semaphore: 标记是否存在可用资源

  1. 没有所属概念,使用较为随意
  2. 在使用过程中,由于较为随意,所以容易出现一些问题:
    • 意外释放: a和b都打算使用同一个信号量,但是在编写b的过程中,忘记申请信号,直接释放
    • 递归死锁: a申请了信号,a的子程序仍然要继续申请
    • 任务死亡导致死锁: a申请到了信号,但是没有释放就挂了
    • 优先级反转: a和c都需要信号量,此时c申请到了信号。但是a优先级高于c,所以a抢占c,但因为需要信号,所以重新调用c,a阻塞。而此时b优先级高于c,低于a,会抢占c
  3. 信号量更多用于同步(通知某一方可以执行)

lock/mutex(mutual exclusion): 标记某方是否可以申请相关资源

  1. 有所属概念,谁拥有,谁释放。相当于对semaphore添加了一些使用规则,相较于semaphore更安全
  2. 不同的系统实现不同,因此对于semaphore中出现的问题,解决的力度也不一样
  3. 锁更多用于保护资源,防止不一致

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