我已经在Stackoverflow上阅读了有关此主题的帖子,但无法理解要点。也许我们可以将它们的差异限制在一个特定的例子中。
有一个带锁的厕所。 Mutex:一个线程接受密钥进入。如果任何其他线程需要进入厕所,他们等待。当前的主人出来并给出了守卫(OS内核)的钥匙,后者将厕所的船主交给另一个人。
问题陈述:我看到所有人都同意共享资源必须由锁定它的那个线程中的相同互斥锁解锁。但对于二进制信号量,它也可以在任何其他线程中解锁。 现在请考虑信号量的实现。
第一个人到厕所,执行wait语句,信号量结构的值从1变为0.现在,如果任何其他人(其他线程)来执行wait语句,它将阻塞因为&# 39;值= 0'。那么为什么总是说任何其他线程可以解锁马桶/关键部分特别是当没有其他线程可以进入关键部分?
答案 0 :(得分:2)
互斥锁具有线程关联性。只有获取互斥锁的线程才能释放它。信号量没有亲和力。这是互斥的一个很好的属性,它可以避免意外,并可以告诉你何时出错。互斥锁也可以是递归的,允许同一个线程多次获取它。防止意外死锁的对策。
有用的属性,您需要在编写并发代码时获得的所有帮助。但可以肯定的是,信号量也可以完成工作。
答案 1 :(得分:0)
二进制信号量是一个常规信号量,其值只能为0(资源不可用)或1(资源可用),它与互斥锁(锁定)之间存在无差异
进入厕所后,信号量会减少,等待信号量的其他人阻止进入临界区。阻塞的进程/线程/通常保存在某种队列中;当进程离开厕所时,第一个进程等待将被唤醒。
我不确定在信号量为0时,线程可以解读关键部分的位置。
(注意,可能存在实施差异)
答案 2 :(得分:-1)
二进制信号量和互斥量之间确实没有任何区别。
这些之间唯一的概念差异是互斥锁只能代表一个密钥,而信号量可能代表多个(编号)密钥。
举个例子。
有5个厕所:
当您申请信号量时,您会获得特定厕所的钥匙。 退出时,马桶与其余的马桶对齐。
如果所有厕所都满了,那么没有人可以进入。
如果您使用互斥锁解决此问题,那么互斥锁将保护密钥箱,您必须不断检查密钥是否可用,但信号量可以表示密钥集。