提升线程notify_all()和sleep()

时间:2012-07-12 09:38:06

标签: c++ multithreading

boost::condition_variable cond;
boost::mutex mut;
bool ready = false;

void consumer() {
    boost::mutex::scoped_lock lock(mut);
    while (!ready) {
         cond.wait(lock);
    }
}

void producer() {
    boost::mutex::scoped_lock lock(mut);
    ready = true;
    cond.notify_all();
    boost::this_thread::sleep(boost::posix_time::seconds(4));
}

参考上面的代码,我在调用notify_all()后实际上睡了生产者线程4秒钟。但是,消费者线程实际上在4秒后被唤醒。那么我怎么能绕过这个并在我调用notify_all()之后立即唤醒消费者线程,尽管睡眠时间为4秒。提前谢谢。

2 个答案:

答案 0 :(得分:3)

它与boost :: mutex :: scoped_lock lock(mut)有关;在生产者。 当范围在睡眠后结束时,互斥锁仅在其后释放。

尝试使用它,如果你想保留你的scoped_lock。

void producer() {
  {
    boost::mutex::scoped_lock lock(mut);
    ready = true;
    cond.notify_all();
  }
  boost::this_thread::sleep(boost::posix_time::seconds(4));
}

答案 1 :(得分:1)

只有在函数范围结束后才会释放作用域锁定。由于您的消费者实际上需要在他们继续执行之前重新获取锁定,因此他们将被阻止,直到生产者释放锁定,即使您已通知他们醒来。

使用@Clement提议的解决方案来减少锁定范围,或者使用可以手动解锁的其他类型的锁定。