【问题标题】:boost thread notify_all() and sleep()提升线程 notify_all() 和 sleep()
【发布时间】:2012-07-12 09:38:05
【问题描述】:
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() 后立即唤醒消费者线程。提前致谢。

【问题讨论】:

    标签: c++ multithreading


    【解决方案1】:

    这与 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));
    }
    

    【讨论】:

    • 谢谢,它有效,那么我可以使用其他什么锁来解决这个问题?
    【解决方案2】:

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

    要么使用@Clement 提出的解决方案来缩小锁定范围,要么使用可以手动解锁的不同类型的锁定。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-16
      • 2018-07-03
      • 1970-01-01
      • 2012-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多