Multithreading 其他流程获胜';不要用信号灯叫醒
以下代码来自Multithreading 其他流程获胜';不要用信号灯叫醒,multithreading,operating-system,semaphore,Multithreading,Operating System,Semaphore,以下代码来自 wait(信号量s){ s=s-1; 如果(s=0){ //从队列中删除进程p 唤醒(p); } } 如果容量为1时有2个以上的进程(s初始化为1),该怎么办?例如,流程1进入关键会话。然后进程2和3调用等待s现在等于-2。然后进程1完成并调用信号s变为-1。因为不能满足s>=0,所以进程2和3永远不会被唤醒。这里有什么问题吗?看看 与维基图书链接相反 在wiki文章和Windows中,信号量为零或具有正计数,可以使用计数的无符号整数实现。如果信号量已经为零,则信号量的wait
wait(信号量s){
s=s-1;
如果(s=0){
//从队列中删除进程p
唤醒(p);
}
}
如果容量为1时有2个以上的进程(s
初始化为1),该怎么办?例如,流程1进入关键会话。然后进程2和3调用等待<代码>s
现在等于-2。然后进程1完成并调用信号
<代码>s
变为-1。因为不能满足s>=0
,所以进程2和3永远不会被唤醒。这里有什么问题吗?看看
与维基图书链接相反
在wiki文章和Windows中,信号量为零或具有正计数,可以使用计数的无符号整数实现。如果信号量已经为零,则信号量的wait函数不会减少信号量,而只是等待。如果多个进程或线程正在等待count==0的信号量,那么如果信号量增加1,则只会唤醒其中一个进程或线程(并且信号量减回到零),并且将唤醒哪个进程或线程取决于操作系统
指向Windows信号量描述的链接以及指向信号量函数的其他链接
代码错误,如果(s)出现,则必须是
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);
}
}