当前位置:  开发笔记 > 编程语言 > 正文

使用std :: conditional_variable在条件上等待

如何解决《使用std::conditional_variable在条件上等待》经验,为你挑选了1个好方法。



1> Yakk - Adam ..:

条件变量虚假地唤醒事物.

必须有一个互斥锁,它必须保护某种类型的消息才能使它们工作,或者你无法保证发生任何这种唤醒.

大概是这样做的,因为非虚假版本的有效实现最终无论如何都会以这种虚假版本的形式实现.

如果您无法使用互斥锁保护消息编辑(即,没有同步,则消息的状态是未定义的行为.这可能导致编译器优化内存读取以在第一次读取后跳过它.

即使排除了未定义的行为(想象你使用原子),也存在设置消息,发生通知的竞争条件,并且如果您未能在两者之间的时间内获取互斥锁,则等待通知的任何人都会看到消息被设置设置变量并通知条件变量.

除极端情况外,您通常希望使用lambda版本wait.

除非您同时审核通知代码和等待代码,否则无法审核条件变量代码.

struct gate {
  bool gate_open = false;
  mutable std::condition_variable cv;
  mutable std::mutex m;

  void open_gate() {
    std::unique_lock lock(m);
    gate_open=true;
    cv.notify_all();
  }
  void wait_at_gate() const {
    std::unique_lock lock(m);
    cv.wait( lock, [this]{ return gate_open; } );
  }
};

要么

  void open_gate() {
    {
      std::unique_lock lock(m);
      gate_open=true;
    }
    cv.notify_all();
  }

推荐阅读
家具销售_903
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有