我有两个关于互斥锁的问题: 1.当互斥变量等于1时,我们对它进行signal()操作,预计会发生什么? 2.当互斥锁等于0时,我们执行wait(),然后线程被阻塞,互斥锁保持为0.正确吗?一段时间后,另一个线程进行signal()操作,然后释放阻塞。现在互斥量的价值是多少? 0还是1?
答案 0 :(得分:4)
因此,概念上互斥锁有两种状态:锁定和解锁。如果它由0或1表示在这里不重要。
如果解锁(即发出信号)互斥锁,它会将其状态从锁定状态更改为解锁状态。进一步解锁不会改变其状态,实际上也没有做任何事情。
如果互斥锁被解锁并且您调用wait,则该调用不执行任何操作(它不会等待)并且该线程继续执行。
当互斥锁被锁定并且您调用wait时,该线程被阻止。当其他线程调用解锁时,释放阻塞并且互斥锁将解锁。
最重要的是解锁和锁定操作是原子的,因为并行调用不能相互重叠以产生损坏的结果(正式地说:并行调用锁定/解锁总是等同于某些序列化的调用历史记录)。否则,互斥体的整个概念将简直是愚蠢的。 :)
答案 1 :(得分:1)
在阅读了评论(以及未经编辑的原始问题)之后,很明显有足够多的人认为二进制sempahores可以与互斥体互换。如果我们用实际的术语(即pthread mutex
和System V semaphore
)说话,那么它们就非常不同。我将尝试概述下面最重要的差异。