Answers
mutex体现的是一种竞争,我离开了,通知你进来。
cond体现的是一种协作,我准备好了,通知你开始吧。
cond经常用来实现(或者说封装成),waitforevent / setevent 这样的机制。
考虑这样的简单场景:
A线程从队列中取元素,B线程往队列中存放元素。不考虑免锁的实现。
需要一个mutex用来保护队列的一致性,避免两个线程同时操作队列破坏数据结构。
当队列为空的时候,A需要不断的探测队列状态:
while(1) {
if (q.empty())
sleep(10); //release cpu
else {
mutex_lock(&l);
v = q.pop();
mutex_unlock(&l);
……
}
}
这就有一个问题,可能在我刚进入sleep时,B放入元素了,但我仍然需要sleep完整个10单位的时间。造成不必要的延迟。
当然你不sleep,也可以,但会造成不必要的CPU开销。
如果使用基于条件变量的事件通知唤醒机制,就完美了。
一旦B放入元素就执行setevent,当前阻塞的线程就会立即被唤醒开始干活儿。
月影故海君离帝
answered 10 years, 8 months ago