基于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
相关产品推荐
相关产品推荐

