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

时间:2017-03-25 15:09:51

标签: multithreading algorithm operating-system

我无法理解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()的任何想法。我错过了一些东西。

1 个答案:

答案 0 :(得分:1)

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

  

即使这样,两个线程也可能会减少S值。然后是整个想法   使用信号量失去了。

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

假设多个线程在while循环中等待。这意味着S0。一旦信号被执行,S变为1且条件

while S <= 0

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

  

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