Concurrency 信号量有两种类型的wait()。哪一个是真的?

Concurrency 信号量有两种类型的wait()。哪一个是真的?,concurrency,operating-system,semaphore,mutual-exclusion,Concurrency,Operating System,Semaphore,Mutual Exclusion,我在读西尔伯沙茨的书和《信号灯》,我发现有些东西让人困惑 在Silberschatz的书中,wait()有两种类型的定义 第一个是: wait(S) { while (S<= 0) ; //busy-wait S--; } 等待{ while(Svalue--); 如果(S->值list中; block(); } } 哪一个是真的? 当我们调用wait for semaphore时,我们应该首先做什么?检查信号量值还是减少其值?这两个都是正确的,但正

我在读西尔伯沙茨的书和《信号灯》,我发现有些东西让人困惑

在Silberschatz的书中,wait()有两种类型的定义

第一个是:

wait(S) { 
    while (S<= 0)
        ; //busy-wait
    S--; 
}
等待{
while(Svalue--);
如果(S->值<0){
将此流程添加到S->list中;
block();
}
}
哪一个是真的?
当我们调用wait for semaphore时,我们应该首先做什么?检查信号量值还是减少其值?

这两个都是正确的,但正如书中明确提到的那样,first定义存在的问题。这意味着它使CPU保持忙碌,但不工作,因此浪费CPU周期

然而,在第二个定义中,不存在忙等待的问题,因为每当信号量的值不大于0时,进程就会被阻塞,因此进入等待状态,这意味着它被从CPU上取下,不能再浪费CPU周期

wait(semaphore *S) {
S->value--;
if (S->value < 0) {
    add this process to S->list;
    block();
    }
}