信号量示例
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
先执行,而 P1
在 P0
中的两个 Signal(S)
调用之间执行(忽略 Wait(Q)
现在有点)。 P1
被释放,并假定它对 S
具有独占访问权限,但随后 P0
执行第二个 Signal(S)
,打破了互斥的假设。
第二个Signal(S)
的效果取决于信号量。如果它是二进制的,那么如果它是在第一次和第二次 Signal(S)
调用之间获取的,它将被重新发送信号。如果什么都没有获得,它就什么都不做。
如果它是一个计数信号量,那么它的计数器将递增,或者任何额外的等待线程将被允许继续。如果有最大值,则不会超过这个值。
让我们有两个信号量 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
先执行,而 P1
在 P0
中的两个 Signal(S)
调用之间执行(忽略 Wait(Q)
现在有点)。 P1
被释放,并假定它对 S
具有独占访问权限,但随后 P0
执行第二个 Signal(S)
,打破了互斥的假设。
第二个Signal(S)
的效果取决于信号量。如果它是二进制的,那么如果它是在第一次和第二次 Signal(S)
调用之间获取的,它将被重新发送信号。如果什么都没有获得,它就什么都不做。
如果它是一个计数信号量,那么它的计数器将递增,或者任何额外的等待线程将被允许继续。如果有最大值,则不会超过这个值。