3

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

有一个带锁的厕所。互斥:一个线程拿钥匙进去。如果有其他线程需要进入厕所,他们等待。当前所有者出来并将钥匙交给守卫(操作系统内核),守卫将厕所的所有权交给另一个人。

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

第一个人到达厕所,执行wait语句,信号量结构的值从1变为0。现在如果有其他人(其他线程)来执行wait语句,它将阻塞,因为'value = 0' . 那么为什么总是说任何其他线程都可以在没有其他线程进入临界区时专门解锁厕所/临界区?

4

3 回答 3

2

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

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

于 2013-07-03T19:16:48.620 回答
0

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

在一个进程进入厕所后,信号量会递减,并且任何其他等待信号量的人都被阻止进入临界区。阻塞的进程/线程/通常保存在某种队列中;当进程离开厕所时,第一个等待的进程将被唤醒。

我不确定你在哪里读到当信号量为 0 时线程可以解锁临界区。

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

于 2013-07-03T17:04:39.910 回答
-1

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

它们之间唯一的概念区别是互斥体只能表示一个键,而信号量可能表示多个(编号的)键。

举这个例子。

有5个厕所:

当你请求一个信号量时,你会得到一个特定厕所的钥匙。当您离开时,那个厕所与剩余的免费厕所排成一列。

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

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

于 2013-07-03T17:07:58.003 回答