互斥和signal()以及wait()操作

时间:2015-12-29 15:27:11

标签: multithreading mutex semaphore

我有两个关于互斥锁的问题: 1.当互斥变量等于1时,我们对它进行signal()操作,预计会发生什么? 2.当互斥锁等于0时,我们执行wait(),然后线程被阻塞,互斥锁保持为0.正确吗?一段时间后,另一个线程进行signal()操作,然后释放阻塞。现在互斥量的价值是多少? 0还是1?

2 个答案:

答案 0 :(得分:4)

因此,概念上互斥锁有两种状态:锁定和解锁。如果它由0或1表示在这里不重要。

如果解锁(即发出信号)互斥锁,它会将其状态从锁定状态更改为解锁状态。进一步解锁不会改变其状态,实际上也没有做任何事情。

如果互斥锁被解锁并且您调用wait,则该调用不执行任何操作(它不会等待)并且该线程继续执行。

当互斥锁被锁定并且您调用wait时,该线程被阻止。当其他线程调用解锁时,释放阻塞并且互斥锁将解锁。

最重要的是解锁和锁定操作是原子的,因为并行调用不能相互重叠以产生损坏的结果(正式地说:并行调用锁定/解锁总是等同于某些序列化的调用历史记录)。否则,互斥体的整个概念将简直是愚蠢的。 :)

答案 1 :(得分:1)

在阅读了评论(以及未经编辑的原始问题)之后,很明显有足够多的人认为二进制sempahores可以与互斥体互换。如果我们用实际的术语(即pthread mutex和System V semaphore)说话,那么它们就非常不同。我将尝试概述下面最重要的差异。

  1. 概念所有权。 Mutexes由他们的储物柜拥有,sempahores不归任何人拥有。这导致两个disticntions。 非常重要一个是互斥锁可以(应该)只由所有者(锁定线程)解锁,而sempahores可以被任何线程解锁(请参阅下面的权限)。不太重要的是互斥体可以重新进入 - 也就是说,可以使用所有者线程多次锁定 - 而信号量不能表现如此。我说它不太重要,因为重入的互斥体几乎总是存在设计缺陷。
  2. 信号量是与用户或多或少无关的对象。它们可以由完全不相关的进程或线程创建,使用和销毁,这些进程或线程甚至不需要彼此了解任何内容(或同时执行)。例如,一个进程可能会创建一个信号量而不是die,而其他进程可以使用它,而第三个进程将删除它。信号量具有与它们相关联的权限(与文件权限不同),而互斥体没有这样的东西 - 任何有技术访问互斥的人都可以使用它做任何事情。
  3. 信号量是进程共享的。也就是说,它们可以由多个进程使用而无需额外的努力。默认互斥锁只是单进程,如果多个进程使用相同的互斥锁,则必须以特殊模式创建它。