为什么在sem_wait中不需要while循环?

时间:2016-12-07 16:27:40

标签: conditional-statements mutex semaphore

我正在尝试使用cond变量和信号量来比较生产者消费者问题实现。

使用cond变量实现:

acquire(m); // Acquire this monitor's lock.
while (!p) { // While the condition/predicate/assertion that we are waiting for is not true...
    wait(m, cv); // Wait on this monitor's lock and condition variable.
}
// ... Critical section of code goes here ...
signal(cv2); -- OR -- notifyAll(cv2); // cv2 might be the same as cv or different.
release(m); 

使用信号量实现:

produce:
    P(emptyCount)
    P(useQueue)
    putItemIntoQueue(item)
    V(useQueue)
    V(fullCount)

为什么信号量实现不使用while循环来检查cond变量实现中的条件。?

while (!p) { // While the condition/predicate/assertion that we are waiting for is not true...
        wait(m, cv); // Wait on this monitor's lock and condition variable.
    }

Why do you need a while loop while waiting for a condition variable

1 个答案:

答案 0 :(得分:0)

抓取信号量确实在内部使用紧密循环,就像cond版本一样,但它会在每次迭代中将执行返回给调度程序,以免浪费像繁忙循环那样的资源。

当调度程序执行了一段时间的某个其他进程时,它会将执行返回给您的线程。如果信号量现在可用,它就会被抓住;否则它会返回调度程序,让其他进程在重试之前再运行一些。