信号量示例

A Semaphore example

让我们有两个信号量 S 和 Q 并且都初始化为 1 :

P0      P1
Wait(S) Wait(S)
Wait(Q) Wait(Q)
…   …
…   …
Signal(S)   Signal(Q)
Signal(S)   Signal(S)

这里会发生什么不想要的情况?此外,进程 p0 对 s 进行的第二次信号调用对这种情况 (s) 有何影响?

这在很大程度上取决于信号量的实现。它是计数信号量还是二进制?如果算的话,是有上限还是无限制?

如果 P0 先执行,可能会出现一个糟糕的情况,Q 被获取但从未释放,因此 P1 将永远等待 Q

另一个可能发生的糟糕情况是如果 P0 先执行,而 P1P0 中的两个 Signal(S) 调用之间执行(忽略 Wait(Q) 现在有点)。 P1 被释放,并假定它对 S 具有独占访问权限,但随后 P0 执行第二个 Signal(S),打破了互斥的假设。

第二个Signal(S)的效果取决于信号量。如果它是二进制的,那么如果它是在第一次和第二次 Signal(S) 调用之间获取的,它将被重新发送信号。如果什么都没有获得,它就什么都不做。

如果它是一个计数信号量,那么它的计数器将递增,或者任何额外的等待线程将被允许继续。如果有最大值,则不会超过这个值。