将deadline_timer偏移10毫秒

boost deadline_timer shift 10 milliseconds

本文关键字:偏移 10毫秒 timer deadline      更新时间:2023-10-16

有没有人遇到过deadline_timer不断地在10毫秒后调用下一个回调函数?这是意料之中的吗?

操作系统是centos 6, boost版本是1.54

Aug 14 16:36:01.697
Aug 14 16:36:02.706
Aug 14 16:36:03.716
Aug 14 16:36:04.726
Aug 14 16:36:05.736
Aug 14 16:36:06.746
Aug 14 16:36:07.756
Aug 14 16:36:08.766
Aug 14 16:36:09.776
Aug 14 16:36:10.786
Aug 14 16:36:11.796
Aug 14 16:36:12.806
Aug 14 16:36:13.816
Aug 14 16:36:14.826
Aug 14 16:36:15.836
Aug 14 16:36:16.846
Aug 14 16:36:17.856

代码如下所示

// std::unique_ptr<boost::asio::deadline_timer> m_poTimer;
void timerExpired(const boost::system::error_code& oError)
    {
        if (!oError)
        {
            m_poTimer->expires_from_now(boost::posix_time::millisec(1000));
            m_poTimer->async_wait(std::bind(&timerExpired, this, std::placeholders::_1));
        }
        else
        {
        }
    }

与通用分时操作系统上的任何应用层计时器一样,从根本上不可能保证在精确的时间之后执行。你的操作系统不断地在进程和线程之间进行上下文切换,通常大约5-10ms的分辨率,你的代码没有办法中断CPU立即执行,没有什么东西唤醒它,并在第一时间检查计时器。

所有应用层计时器都是为"至少t"而设置的,你对此无能为力。

我承认很惊讶你有这样一个可靠和可重复的模式,但要么:

  • 这是你的环境因素(我们不能说话),或者
  • 这是库的一个因素(我看不到任何证据),或者
  • 这是您的代码的一个因素(我们无法判断,因为您没有提供测试用例),或者
  • 这只是由上述事实造成的异常,你对此无能为力。