Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 其他流程获胜';不要用信号灯叫醒_Multithreading_Operating System_Semaphore - Fatal编程技术网

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);
    }
}