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秒。提前谢谢。
答案 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提议的解决方案来减少锁定范围,或者使用可以手动解锁的其他类型的锁定。