boost::asio::steady_timer 比预期提前到期

问题描述 投票:0回答:0

我正在开发一个网络应用程序,如果在延迟时间内没有答案返回,每个请求都必须超时。

为此,我一直在尝试将

boost::asio::steady_timer
async_wait
一起使用。 不幸的是,我意识到超时过早过期,经过一些测试后,似乎计时器实际上在正确的延迟后过期,但由于计时器的构造,而不是
async_wait
的调用,正如预期的那样。

考虑以下代码:

#include<iostream>
#include<thread>
#include<boost/asio/steady_timer.hpp>
#include<boost/asio/strand.hpp>
using namespace std::literals;
int main(){
    boost::asio::io_context io;
    boost::asio::steady_timer timer{boost::asio::make_strand(io),1s};//desired delay is 1 sec
    std::this_thread::sleep_for(1500ms);//timer was created 1.5 s ago
    timer.async_wait([](const boost::system::error_code& ec){
        if(ec!=boost::asio::error::operation_aborted){
            std::cout<<"timeout"<<std::endl;
        }
    });
    io.run();
}

编译成

bin
并运行
time bin

timeout

________________________________________________________
Executed in    1.52 secs      fish           external
   usr time    6.68 millis    0.00 micros    6.68 millis
   sys time   11.31 millis  617.00 micros   10.69 millis

可以看到,二进制文件在 1.5 秒后返回,这意味着计时器立即超时。如果

sleep_for
行被注释掉,它将在 1 秒后返回,如预期的那样。

这是正常行为吗?

c++ timer boost-asio
© www.soinside.com 2019 - 2024. All rights reserved.