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

posted on 2019-06-24 16:35 o0阿Q0o 阅读() 评论() 编辑 收藏

版权声明:本文为wFrancow原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/wFrancow/p/11077638.html