我正在尝试使用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
答案 0 :(得分:0)
抓取信号量确实在内部使用紧密循环,就像cond
版本一样,但它会在每次迭代中将执行返回给调度程序,以免浪费像繁忙循环那样的资源。
当调度程序执行了一段时间的某个其他进程时,它会将执行返回给您的线程。如果信号量现在可用,它就会被抓住;否则它会返回调度程序,让其他进程在重试之前再运行一些。