使用pthread和系统时间向后滚动时,boost :: this_thread :: sleep_for可能会挂起

时间:2019-04-25 10:27:56

标签: c++ boost pthreads

当我在Linux上调用boost::this_thread::sleep_for(boost::chrono::milliseconds(50))并将系统时间回滚10秒钟时,执行sleep_for只需10.05秒钟而不是0.05秒钟。

我已经检查过,usleep(50000)std::this_thread::sleep_for(std::chrono::milliseconds(50))不会导致此问题。

我在Windows上检查过,boost::this_thread::sleep_for(boost::chrono::milliseconds(50))不会导致此问题。

实际提升代码:

    // Use pthread_delay_np or nanosleep whenever possible here in the no_interruption_point
    // namespace because they do not provide an interruption point.
    #   if defined(BOOST_HAS_PTHREAD_DELAY_NP)
    #     if defined(__IBMCPP__) ||  defined(_AIX)
                  BOOST_VERIFY(!pthread_delay_np(const_cast<timespec*>(&ts.getTs())));
    #     else
                  BOOST_VERIFY(!pthread_delay_np(&ts.getTs()));
    #     endif
    #   elif defined(BOOST_HAS_NANOSLEEP)
                  nanosleep(&ts.getTs(), 0);
    #   else
                  // This should never be reached due to BOOST_THREAD_SLEEP_FOR_IS_STEADY
    # endif

我们可以看到,如果定义了BOOST_HAS_PTHREAD_DELAY_NP(并且在我所有的Linux PC上都进行了定义,包括Debian存储库中的libboost),请增强对pthread_delay_np()的调用。

根据pthread_delay_np的描述,当我们回滚时,它似乎应该挂起:

  

此例程导致线程将执行延迟特定的时间间隔     时间。该时间间隔在当前时间加上指定的时间间隔结束。     在间隔时间结束之前,例程将不会返回

但是对boost sleep_for的描述似乎是稳定的时钟:

  

挂起当前线程,直到经过rel_time指定的持续时间为止。

我希望sleep_for是稳定的时钟。 是增强问题,还是应该在没有BOOST_HAS_PTHREAD_DELAY_NP的情况下重新编译增强?

0 个答案:

没有答案