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

基于boost::asio::steady_timer与yield上下文的延迟函数挂起问题求助

基于boost::asio::steady_timer与yield上下文的延迟函数挂起问题求助

我有一个基于单线程boost::asio上下文运行的C++应用,目前在实现一个基于boost::asio::steady_timer的延迟函数时遇到了挂起问题,具体情况如下:

场景与代码结构

  • 问题代码是一个类的成员函数asyncDelay,该类位于共享库中,由主进程实例化并调用
  • boost::asio::steady_timer是该类的std::unique_ptr成员,在类的构造函数中通过boost IO_context完成初始化
  • asyncDelay会被多个boost::asio::spawn协程调用,但每个调用对应独立的类实例,不存在多个协程复用同一个定时器的情况
  • asyncDelay函数本身是在boost::asio::spawn的协程上下文内被调用的

问题代码

void asyncDelay(const uint16_t delay)
{
    boost::system::error_code ec;
    std::string errorMsg;

    if(!waitTimer)
    {
        errorMsg = "wait timer not created";
        log<level::ERR>(errorMsg.c_str());
        throw std::runtime_error(errorMsg.c_str());
    }

    errorMsg = "wait timer delay : " + std::to_string(delay);
    log<level::ERR>(errorMsg.c_str());

    waitTimer->expires_after(boost::asio::chrono::milliseconds(100));
    log<level::INFO>("steady timer delay set");

    waitTimer->async_wait(yield[ec]);
    log<level::INFO>("steady timer delay done");

    if (ec == boost::asio::error::operation_aborted)
    {
        errorMsg = "wait timer aborted";
        log<level::ERR>(errorMsg.c_str());
        throw std::runtime_error(errorMsg.c_str());
    }
    else if (ec)
    {
        errorMsg = "wait timer failed";
        log<level::ERR>(errorMsg.c_str());
        throw std::runtime_error(errorMsg.c_str());
    }

    return;
}

问题现象

当调用asyncDelay函数时,日志可以正常输出到"steady timer delay set",但代码会卡在waitTimer->async_wait(yield[ec]);这一行,后续的"steady timer delay done"日志永远不会输出,程序直接挂起在这里,定时器的延迟逻辑完全没有生效。

我已经确认:

  • 定时器waitTimer已经通过类构造函数正确初始化(没有触发"wait timer not created"的错误日志)
  • 上下文的IO_context是单线程运行的,主进程的事件循环也在正常运转

请问有没有人遇到过类似的问题?或者能帮我排查下为什么定时器的async_wait配合yield协程会出现挂起的情况?


备注:内容来源于stack exchange,提问作者Mars shadows

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.21 07:03:01