Linux中已存在互斥锁,为什么还需要条件变量呢?


使用互斥锁可以实现线程间的同步,为什么还存在条件变量呢?条件变量在什么环境下使用呢?

Linux 多线程

yuanta 10 years, 8 months ago

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,当前阻塞的线程就会立即被唤醒开始干活儿。

   
  while(1) {
  
if (q.empty())
waitforevent(&e); //release cpu until B setevent
else {
mutex_lock(&l);
v = q.pop();
mutex_unlock(&l);
……
}
}

月影故海君离帝 answered 10 years, 8 months ago

Your Answer