首页 文章

厕所关键例子中Binary Semaphore和Mutex之间的区别?

提问于
浏览
3

我已经在Stackoverflow上阅读了关于此主题的帖子,但无法理解要点 . 也许我们可以将它们的差异限制在一个具体的例子

带锁的卫生间 . Mutex:一个线程接受密钥进入 . 如果任何其他线程需要进入厕所,他们等待 . 当前所有者出来并将钥匙交给警卫(OS内核),后者将厕所的船主交给另一个人 .

问题陈述:我看到所有人都同意共享资源必须由锁定它的那个线程中的相同互斥锁解锁 . 但对于二进制信号量,它也可以在任何其他线程中解锁 . 现在请考虑信号量的实现 .

第一个人到达厕所,执行wait语句,信号量结构的值从1变为0.现在,如果任何其他人(其他线程)来执行wait语句,它将阻塞,因为'value = 0' . 那么为什么总是说任何其他线程可以解锁马桶/关键部分特别是当没有其他线程可以进入关键部分?

3 回答

  • -1

    互斥锁具有线程关联性 . 只有获取互斥锁的线程才能释放它 . 信号量没有亲和力 . 这是互斥的一个很好的属性,它可以避免意外,并可以告诉你何时出错 . 互斥锁也可以是递归的,允许同一个线程多次获取它 . 防止意外死锁的对策 .

    有用的属性,您需要在编写并发代码时获得的所有帮助 . 但可以肯定的是,信号量也可以完成工作 .

  • 2

    二进制信号量是一个常规信号量,其值只能为0(资源不可用)或1(资源可用),它与互斥锁(锁定)之间没有区别 .

    一个过程进入马桶后,信号量减少,等待信号量的任何其他人被阻止进入临界区 . 阻塞的进程/线程/通常保存在某种队列中;当该过程离开马桶时,第一个等待的过程将被唤醒 .

    我不确定你在哪里阅读线程可以在信号量为0时解锁关键部分 .

    (注意,可能存在实施差异)

  • 0

    二进制信号量和互斥量之间确实没有任何区别 .

    这些之间唯一的概念差异是互斥体只能代表一个密钥,而信号量可能代表多个(编号)密钥 .

    举个例子 .

    有5个卫生间:

    当您申请信号量时,您将获得特定厕所的钥匙 . 当您离开时,马桶与其余的马桶对齐 .

    如果所有厕所都满了,那么没有人可以进入 .

    如果您使用互斥锁解决此问题,则互斥锁将保护密钥箱,您必须不断检查密钥是否可用,但信号量可以表示密钥集 .

相关问题