C++ 升压截止时间\u定时器移位10毫秒

C++ 升压截止时间\u定时器移位10毫秒,c++,boost,C++,Boost,有人遇到过截止期计时器在10毫秒后不断调用下一个回调函数吗?这是预期的吗 操作系统是centos 6,boost版本是1.54 e、 g 代码如下所示 // std::unique_ptr<boost::asio::deadline_timer> m_poTimer; void timerExpired(const boost::system::error_code& oError) { if (!oError) {

有人遇到过截止期计时器在10毫秒后不断调用下一个回调函数吗?这是预期的吗

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

e、 g

代码如下所示

// 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
        {

        }
    }
//std::unique_ptr m_poTimer;
void timerExpired(const boost::system::error\u code&oError)
{
如果(!oError)
{
m_poTimer->expires_from_now(boost::posix_time::毫秒(1000));
m_poTimer->async_wait(std::bind(&timerExpired,this,std::placeholders::_1));
}
其他的
{
}
}

与通用分时操作系统上的任何应用层计时器一样,根本不可能保证在精确时间后执行。您的操作系统不断在进程和线程之间切换上下文,如果没有唤醒CPU并首先检查计时器,您的代码无法中断CPU以立即执行

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

我承认,令人惊讶的是,您拥有如此可靠且可重复的模式,但是:

  • 这是您环境的一个因素(我们无法与之交谈),或者
  • 这是图书馆的一个因素(我看不到证据),或者
  • 这是您代码的一个因素(我们无法确定,因为您没有提供),或者
  • 这只是由上述事实造成的异常现象,你对此无能为力

根据所使用的操作系统和底层计时器,它们可能会在计时器过期后的短时间内触发事件。例如,from:“计时器永远不会在请求的时间之前过期,但可能会在之后的某个(短)时间过期,这取决于系统计时器的分辨率和系统负载”。因此,我是否可以设置任何设置以避免延迟?不,不是真的。事实上,在通用操作系统上几乎不可能有精确的计时器,即使在今天功能强大、速度快的计算机上也是如此。总有一点延迟,除非你想冒险让计时器提前触发。但奇怪的是,总是有10毫秒的延迟。我试着将周期从1000毫秒设置为990毫秒,然后我得到了精确的1秒延迟时钟分辨率?抢占其他流程所需的时间?Boost传播事件所需的时间?也许时间不完全是10毫秒,但有时可能是9.8毫秒,有时是10.2毫秒,它的平均值是10毫秒?除非您研究整个堆栈,从进程到Boost,从内核到硬件,否则无法确切说明原因。
// 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
        {

        }
    }