提升线程 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>

c++多线程 唤醒notify_one/notify_all 必须发生在阻塞之前才是 有效唤醒

在持有互斥锁的同时调用 notify_one()/notify_all() 是不好的做法吗?