我无法理解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 循环。这意味着S
是0
.一旦信号被执行,S
就会变得1
和条件
while S <= 0
变成假的。并且只有一个线程将成功执行S--
语句。引用操作系统的圣经 操作系统原理 作者:Galvin,silberschatz 和 gagne
信号灯整数值的所有修改在 wait() 和 signal() 操作必须不可分割地执行。那是 当一个进程修改信号量值时,其他进程不能 同时修改相同的信号量值。此外,在 wait(S) 的情况,对整数值 S<=0 及其的测试。 可能的修改 S--, 也必须不间断地执行。