C++17中如何用std替代boost::timed_wait()?
替换boost::timed_wait()的std::condition_variable等效方案
问题描述
我有一个条件变量std::condition_variable my_cond;,想要用标准库的等效方法替代boost::timed_wait()。之前使用Boost条件变量时,调用方式是:
cond_.timed_wait(lock, timeout);
其中lock是std::scoped_lock lock(mutex_);,timeout基于boost::chrono实现。
目前已将boost::chrono、Boost锁和Boost互斥量替换为对应的std版本,但未找到timed_wait()的替代方案。我需要一个std下的函数,第一个参数为锁,第二个参数为std::chrono类型的时间。查阅std::condition_variable::wait文档后,未发现第二个参数为时间类型的重载版本,请问能否将boost::timed_wait()转换为std::wait()?
补充报错信息
尝试相关建议后出现编译错误:
error: no matching function for call to std::condition_variable::wait_for(std::scoped_lock<std::mutex>&, const std::chrono::time_point<std::chrono::_V2::system_clock, std::chrono::duration<long int, std::ratio<1, 1000000000> > >&)
报错代码行:
if(!my_cond.wait_for(lock,timeout))
相关变量定义:
timeout:auto const timeout = std::chrono::system_clock::now() + std::chrono::milliseconds( ms );lock:std::scoped_lock lock(mutex_);mutex_:mutable std::mutex mutex_;
解决方案
Boost的timed_wait(lock, timeout)(其中timeout是时间点)对应的标准库等效函数是std::condition_variable::wait_until,而非wait_for:
wait_for接受的是时间段(如std::chrono::milliseconds(100)),不是时间点wait_until才是接受时间点的重载,完全匹配Boosttimed_wait的用法
修改后的代码应为:
if(!my_cond.wait_until(lock, timeout))
注意事项
wait_until和wait_for的返回值逻辑与Boosttimed_wait一致:返回true表示被通知唤醒,false表示超时std::scoped_lock<std::mutex>满足wait_until对锁类型的要求(支持解锁和重锁),无需更换锁类型- 若原Boost代码中
timeout基于系统时钟,使用std::chrono::system_clock是正确的,无需切换时钟类型
内容的提问来源于stack exchange,提问作者user1584421
相关产品推荐
相关产品推荐

