对信号量 wait() 操作的实现感到困惑



我无法理解wait()中的原子操作。wait() 操作在许多源代码/书籍中都是这样实现的:

wait(S) {
while S <= 0;
S--;
}

如果 S--,S<=0 等操作和 S++ 的信号操作是原子操作。即使这样,两个线程也可能递减 S 值。然后,使用信号量的整个想法就丢失了。

我什至从维基百科中找到了一些支持,它给出了 wait() 的实现,如下所示,并说如果包含 S-- 的块是原子的。对我来说,这是完全有道理的。

wait(S) {
while true:
[ if S<= 0:
S--;
]

关于 wait() 的第一个实现的任何想法。我错过了什么东西。

除了初始化之外,信号量S只能通过信号等待操作访问。

即使这样,两个线程也可能递减 S 值。然后整个想法 使用信号量丢失。

不,这是不可能的。唯一可能的是 多个线程可以尝试减小S的值。

假设多个线程正在等待 while 循环。这意味着S0.一旦信号被执行,S就会变得1和条件

while S <= 0

变成假的。并且只有一个线程将成功执行S--语句。引用操作系统的圣经 操作系统原理 作者:Galvin,silberschatz 和 gagne

信号灯整数值的所有修改在 wait() 和 signal() 操作必须不可分割地执行。那是 当一个进程修改信号量值时,其他进程不能 同时修改相同的信号量值。此外,在 wait(S) 的情况,对整数值 S<=0 及其的测试。 可能的修改 S--, 也必须不间断地执行。

最新更新