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秒的休眠。提前谢谢。
发布于 2012-07-12 17:40:24
它与producer中的boost::mutex::scoped_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));
}发布于 2012-07-12 17:43:40
仅当函数作用域结束时,范围锁才会被释放。由于您的使用者实际上需要重新获取锁,然后才能继续执行,因此它们将被阻塞,直到生产者释放锁,即使您通知它们唤醒也是如此。
要么使用@Clement提出的解决方案来缩小锁定范围,要么使用可以手动解锁的不同类型的锁。
https://stackoverflow.com/questions/11449004
复制相似问题