multithreading - 使用信号量不会唤醒其他进程

标签 multithreading operating-system semaphore

以下代码来自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调用waits现在等于-2。然后,进程1完成并调用signals变为-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/

相关文章:

operating-system - 使用抢占式内核时的信号量

python - 使用 Python os 模块获取 unix 文件类型

c - 希望信号量超过 SEM_VALUE_MAX

C++ CreateThread() "Not responding"

java - 如果其字段不可变,则外部同步的 ArrayList 线程安全吗?

c# - System.Threading.Timer 的可扩展性如何?

c - 在内存中查找进程页面(linux-kernel)

c - 具有等待队列挂起系统的Linux驱动程序代码

c++ - 为什么 semget() 在 *creating* 信号量时会导致 EACCES 错误?

sql-server - SQL Server 代理 - 信号量超时