信号量中的“S->value <= 0”signal() 实现,没有忙等待

Bum*_*Cho 5 synchronization signals semaphore

以下是signal()无忙等待(无忙等待)信号量中的操作代码

实施signal()

signal (semaphore *S) {
    S->value++; 
    if (S->value <= 0) { 
        remove a process P from S->list; 
        wakeup(P);  
    } 
}
Run Code Online (Sandbox Code Playgroud)

我有一个关于“if-condition”的问题。

我认为,S->value零或负的事实意味着没有可用资源,所以wakeup()不应该被允许。但是正如您所看到的,无论何时signal()调用操作,无论S->value.

所以在我看来,不平等的迹象S->value >= 0是自然的,也是有道理的,因为S->value > 0意味着有可用的资源。

有人可以用简单的英语向我解释吗?

San*_*Ipk 4

你在这里混淆了信号量的队列和就绪队列。\n这个解决方案是满足有界等待条件。

\n\n

当一个进程必须等待信号量 S 时,它会被阻塞并放入信号量\xe2\x80\x99s 队列中。\nsignal() 从队列中删除一个进程并将其移至就绪队列。\n因为 signal() 始终是从刚刚完成其关键部分的进程调用。这样就会有一个新的进程添加到就绪队列中。

\n\n

如果当信号量的值为正数时将进程添加到就绪队列中,则没有意义,因为您可以直接使用信号量,而无需加入就绪队列。

\n\n
    signal (semaphore *S) {\n        S->value++; \n        if (S->value <= 0) { \n        remove a process P from S->list; \n        wakeup(P);  //move one process P from S->list to ready list\n        } \n    }\n
Run Code Online (Sandbox Code Playgroud)\n\n

负值表示有多个进程正在等待。\n希望这有帮助。

\n