You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 08:42:22