信号量wait()函数中while循环的目的是什么?可以用if语句代替吗?

时间:2019-01-04 13:16:46

标签: operating-system semaphore

我正在学习操作系统中的信号量,我不了解空while循环的目的。

代码来自我的教科书,我可以看到while(s <= 0)后跟一个';'所以基本上做:什么都不做,然后是s--行。 我不了解其目的或含义,如果是if(s <= 0)而不是while,会有什么不同吗?

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

1 个答案:

答案 0 :(得分:0)

信号量是一个计数器,您可以在其上调用两个函数:decrement(也称为waitp等)和increment({{ 1}},postsignal等。

当线程在信号量上调用v时,会发生以下情况:

  1. 如果信号量计数大于0,则计数减1,并返回对wait的调用
  2. 如果信号量计数小于或等于0,则对wait的调用将等待信号量计数增加到1或更多(当其他线程在线程上调用wait时会发生这种情况)信号量),从计数中减去1,然后返回

以上代码中的post循环用于处理第二种情况。该函数必须等到计数大于0才返回(这就是循环条件为while的原因),因此while循环将继续旋转直到该计数大于0。while循环的目的仅是停止功能前进。没有要重复执行的代码体。

S <= 0语句不足以处理这种情况,因为它仅检查一次if。即使该计数仍小于或等于0,该函数也可以超越S <= 0语句。

请注意,您教科书中的信号灯代码大大简化了实际信号灯的工作方式。通常,如果一个线程调用if并且计数小于或等于0,则该线程将屈服,并且调度程序将使该线程进入睡眠状态,直到另一个线程调用wait。因此,不存在任何while循环,或者存在任何while循环都将与您的问题稍有不同。另外,信号量结构中的整数计数器需要某种保护机制。否则,多个线程可以争分夺秒地递增/递减该计数器,并且即使最初计数为1,多个线程也可能能够通过while循环(因此,信号量将无法正确保护关键部分)。