我无法理解wait()中的原子操作。 wait()操作以这种方式在许多源/书中实现:
wait(S) {
while S <= 0;
S--;
}
如果S--,S <= 0和S ++的信号op等操作是原子的。 即使这样,两个线程也可能会减少S值。然后使用信号量的整个想法都会丢失。
我甚至从Wikipedia找到了一些支持,它给出了wait()的实现,如下所示,并说如果包含S--的块是原子的。对我来说,这是完全合理的。
wait(S) {
while true:
[ if S<= 0:
S--;
]
对第一次执行wait()的任何想法。我错过了一些东西。
答案 0 :(得分:1)
除初始化之外的信号量S
只能通过信号和等待操作进行访问。
即使这样,两个线程也可能会减少S值。然后是整个想法 使用信号量失去了。
不,不可能。唯一可能的是多线程可以尝试减少S
的值。
假设多个线程在while循环中等待。这意味着S
为0
。一旦信号被执行,S
变为1
且条件
while S <= 0
变得虚假。并且只有一个线程将成功执行S--
语句。引用操作系统的圣经操作系统原则由Galvin,silberschatz和gagne
对信号量中整数值的所有修改 wait()和signal()操作必须不可分割地执行。那是, 当一个进程修改信号量值时,没有其他进程可以 同时修改相同的信号量值。另外,在 在等待(S)的情况下,测试S <= 0的整数值及其 可能的修改S--,也必须不间断地执行。