2
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 秒后被唤醒。那么,尽管有 4 秒的睡眠,我如何才能解决这个问题并在调用 notify_all() 后立即唤醒消费者线程。提前致谢。

4

2 回答 2

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));
}
于 2012-07-12T09:40:24.457 回答
1

作用域锁只有在函数作用域结束时才会被释放。由于您的消费者实际上需要重新获取锁才能继续执行,因此即使您通知他们唤醒,他们也会被阻塞,直到生产者释放锁。

Either use the solution proposed by @Clement to reduce the lock scope, or use a different type of lock that you can unlock manually.

于 2012-07-12T09:43:39.567 回答