我正在学习操作系统中的信号量,我不了解空while循环的目的。
代码来自我的教科书,我可以看到while(s <= 0)后跟一个';'所以基本上做:什么都不做,然后是s--行。 我不了解其目的或含义,如果是if(s <= 0)而不是while,会有什么不同吗?
wait (S) {
while S <= 0
; //no-op
S--;
}
答案 0 :(得分:0)
信号量是一个计数器,您可以在其上调用两个函数:decrement
(也称为wait
,p
等)和increment
({{ 1}},post
,signal
等。
当线程在信号量上调用v
时,会发生以下情况:
wait
的调用wait
的调用将等待信号量计数增加到1或更多(当其他线程在线程上调用wait
时会发生这种情况)信号量),从计数中减去1,然后返回以上代码中的post
循环用于处理第二种情况。该函数必须等到计数大于0才返回(这就是循环条件为while
的原因),因此while循环将继续旋转直到该计数大于0。while循环的目的仅是停止功能前进。没有要重复执行的代码体。
S <= 0
语句不足以处理这种情况,因为它仅检查一次if
。即使该计数仍小于或等于0,该函数也可以超越S <= 0
语句。
请注意,您教科书中的信号灯代码大大简化了实际信号灯的工作方式。通常,如果一个线程调用if
并且计数小于或等于0,则该线程将屈服,并且调度程序将使该线程进入睡眠状态,直到另一个线程调用wait
。因此,不存在任何while循环,或者存在任何while循环都将与您的问题稍有不同。另外,信号量结构中的整数计数器需要某种保护机制。否则,多个线程可以争分夺秒地递增/递减该计数器,并且即使最初计数为1,多个线程也可能能够通过while循环(因此,信号量将无法正确保护关键部分)。