我正在开发一个网络应用程序,如果在延迟时间内没有答案返回,每个请求都必须超时。
为此,我一直在尝试将
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 秒后返回,如预期的那样。
这是正常行为吗?