提升deadline_timer转移10毫秒

时间:2015-08-14 08:55:36

标签: c++ boost

有没有人遇到deadline_timer在10毫秒后不断调用下一个回调函数?是预期的吗?

操作系统是centos 6,增强版是1.54。

e.g。

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
        {

        }
    }

1 个答案:

答案 0 :(得分:1)

与通用时间共享操作系统上的任何应用程序层计时器一样,基本上不可能在确切的时间之后保证执行。您的操作系统在进程和线程usually with around 5-10ms resolution之间不断进行上下文切换,并且您的代码无法中断CPU以立即执行,而无需将其唤醒并首先检查计时器。

所有应用程序层计时器都用于“至少 t ”并且您无能为力。

我很遗憾你有这样一个可靠且可重复的模式,但是:

  • 这是您环境的一个因素(我们无法说话)或
  • 这是图书馆的一个因素(我看不到任何证据)或
  • 这是您的代码的一个因素(我们无法分辨,因为您没有提供testcase)或
  • 这只是上述事实所造成的异常现象,你无能为力。