首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >boost线程notify_all()和sleep()

boost线程notify_all()和sleep()
EN

Stack Overflow用户
提问于 2012-07-12 17:38:06
回答 2查看 3K关注 0票数 2
代码语言:javascript
复制
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秒的休眠。提前谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-07-12 17:40:24

它与producer中的boost::mutex::scoped_lock锁(Mut);有关。当作用域在休眠之后结束时,互斥锁只在它之后被释放。

如果你想保留你的scoped_lock,那就试试吧。

代码语言:javascript
复制
void producer() {
  {
    boost::mutex::scoped_lock lock(mut);
    ready = true;
    cond.notify_all();
  }
  boost::this_thread::sleep(boost::posix_time::seconds(4));
}
票数 3
EN

Stack Overflow用户

发布于 2012-07-12 17:43:40

仅当函数作用域结束时,范围锁才会被释放。由于您的使用者实际上需要重新获取锁,然后才能继续执行,因此它们将被阻塞,直到生产者释放锁,即使您通知它们唤醒也是如此。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11449004

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档