我无法理解 wait() 中的原子操作。在许多来源/书籍中,wait() 操作是以这种方式实现的:
wait(S) {
while S <= 0;
S--;
}
如果诸如 S--、S<=0 和 S++ 的信号 op 等操作是原子的。即使这样,两个线程也可能会减少 S 值。然后使用信号量的整个想法就丢失了。
我什至从维基百科中找到了一些支持,它提供了如下的 wait() 实现,并说如果包含 S-- 的块是原子的。对我来说这是完全有道理的。
wait(S) {
while true:
[ if S<= 0:
S--;
]
关于第一次实现wait() 的任何想法。我是不是错过了什么。
S
除了初始化之外的信号量只能通过信号和等待操作访问。
即使这样,两个线程也可能会减少 S 值。然后使用信号量的整个想法就丢失了。
不,这是不可能的。唯一可能的是多个线程可以尝试递减 的值S
。
假设有多个线程在 while 循环中等待。这意味着S
是0
。一旦信号被执行,S
就变成1
了条件
while S <= 0
变得虚假。并且只有一个线程会成功执行该S--
语句。引用操作系统的圣经 操作系统原理 by Galvin,silberschatz 和 Gagne
在 wait() 和 signal() 操作中对信号量整数值的所有修改都必须不可分割地执行。也就是说,当一个进程修改信号量值时,没有其他进程可以同时修改相同的信号量值。另外,在wait(S)的情况下,对S<=0的整数值的测试及其可能的修改S--,也必须不间断地执行。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句