以下代码来自Wiki。
wait(Semaphore s){
s=s-1;
if (s<0) {
// add process to queue
block();
}
}
signal(Semaphore s){
s=s+1;
if (s>=0) {
// remove process p from queue
wakeup(p);
}
}
如果容量为1时我有两个以上的进程怎么办(
s
初始化为1)?例如,进程1进入关键 session 。然后,进程2和3调用wait
。 s
现在等于-2。然后,进程1完成并调用signal
。 s
变为-1。由于不满足s >= 0
的要求,因此永远不会唤醒进程2和3。这是什么问题
最佳答案
看一眼
https://en.wikipedia.org/wiki/Semaphore_(programming)
而不是Wiki书籍链接。
在Wiki文章和Windows中,信号量为零或具有正计数,并且可以使用无符号整数进行计数来实现。信号量的等待功能不会减小信号量(如果已经为零),而是等待。如果多个进程或线程正在等待计数== 0的信号量,则如果信号量增加1,则只有一个进程或线程会被唤醒(信号量递减为零),并且它正在运行取决于将要唤醒的系统。
链接到Windows信号量说明,并带有指向信号量功能的其他链接。
https://msdn.microsoft.com/en-us/library/windows/desktop/ms685129(v=vs.85).aspx
关于multithreading - 使用信号量不会唤醒其他进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47128092/