提升线程 notify_all() 和 sleep()
Posted
技术标签:
【中文标题】提升线程 notify_all() 和 sleep()【英文标题】:boost thread notify_all() and 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() 后立即唤醒消费者线程。提前致谢。
【问题讨论】:
【参考方案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 提出的解决方案来缩小锁定范围,要么使用可以手动解锁的不同类型的锁定。
【讨论】:
以上是关于提升线程 notify_all() 和 sleep()的主要内容,如果未能解决你的问题,请参考以下文章
使用 condition_variable::notify_all 通知多个线程
C++ std::condition_variable notify_one()与notify_all()的作用
std::condition_variable 在 std::condition_variable::notify_all() 从其他线程后未正确唤醒
排序多个线程如何在 std::condition_variable::notify_all 之后重新获取 std::unique_lock<std::mutex>