C++ boost::this_thread::sleep_for在使用pthreads和系统时间向后滚动时可能会挂起

C++ boost::this_thread::sleep_for在使用pthreads和系统时间向后滚动时可能会挂起,c++,boost,pthreads,C++,Boost,Pthreads,当我(在linux上)调用boost::this_thread::sleep_for(boost::chrono::毫秒(50))并将系统时间向后滚动10秒时,执行sleep_for需要10.05秒,而不是0.05秒 我已经检查过,usleep(50000)和std::this_thread::sleep_for(std::chrono::millides(50))不会导致此问题 我在Windows上检查过,(boost::chrono::毫秒(50))的boost::this_线程::slee

当我(在linux上)调用boost::this_thread::sleep_for(boost::chrono::毫秒(50))并将系统时间向后滚动10秒时,执行sleep_for需要10.05秒,而不是0.05秒

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

我在Windows上检查过,(boost::chrono::毫秒(50))的
boost::this_线程::sleep_
不会导致此问题

实际增压代码:

    // 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
//尽可能在无中断点使用pthread\u delay\u np或nanosleep
//命名空间,因为它们不提供中断点。
#如果已定义(BOOST\u有\u PTHREAD\u DELAY\u NP)
#如果已定义(u IBMCPP_uu)| |已定义(_AIX)
BOOST_VERIFY(!pthread_delay_np(const_cast(&ts.getTs()));
#否则
BOOST_VERIFY(!pthread_delay_np(&ts.getTs());
#恩迪夫
#elif已定义(增压器有纳米睡眠)
nanosleep(&ts.getTs(),0);
#否则
//这永远不会达到,因为线程是稳定的
#恩迪夫
正如我们所看到的,如果
BOOST\u定义了\u PTHREAD\u DELAY\u NP
(在我所有的linux PC上都定义了它,包括Debian存储库中的libboost),BOOST调用
PTHREAD\u DELAY\u NP()

从pthread_delay_np的描述来看,当我们回滚时间时,它应该挂起:

此例程使线程将执行延迟一段特定的时间间隔 时间此间隔在当前时间加上指定的间隔结束。 在到达间隔结束之前,例程不会返回

但对boost sleep_的描述似乎是一个稳定的时钟:

挂起当前线程,直到rel_time指定的持续时间结束

我想,的睡眠时间是稳定的。
这是boost问题,还是我应该重新编译boost而不使用
boost\u有\u PTHREAD\u DELAY\u NP

当谈到
std::this\u thread::sleep\u for
时,它看起来像是定义了实现,但:“标准建议使用稳定的时钟来测量持续时间。如果实现改用系统时钟,则等待时间也可能对时钟调整敏感。“那么,试试标准的,看看是否有区别。@TEDLYNMO在我写的时候,我已经检查了-
std::this\u thread::sleep\u for
在我的系统上是稳定的时钟。抱歉,错过了。那么它看起来肯定像是一个助推问题。是否有任何理由坚持使用
boost::this_thread::sleep_for
?@tedlynmo-in-out项目我们更喜欢使用boost而不是std,因为std对于msvc/gcc/等更具体实现。在这种情况下,我认为最简单的解决方案是使用std。我不敢相信,boost中有一个bug——看起来这是一个特性,我不明白。我明白了。如果可能的话,我通常会推广使用标准版本的boost库。:)当谈到
std::this_thread::sleep_for
时,它似乎是一个定义了的实现,但是:“标准建议使用一个稳定的时钟来测量持续时间。如果一个实现使用一个系统时钟,那么等待时间也可能对时钟调整很敏感。”,试试标准的,看看是否有区别。@TedLyngmo在我写的时候,我已经检查了-
std::this\u thread::sleep\u for
在我的系统上是稳定的时钟。抱歉,错过了。那么它看起来肯定像是一个助推问题。是否有任何理由坚持使用
boost::this_thread::sleep_for
?@tedlynmo-in-out项目我们更喜欢使用boost而不是std,因为std对于msvc/gcc/等更具体实现。在这种情况下,我认为最简单的解决方案是使用std。我不敢相信,boost中有一个bug——看起来这是一个特性,我不明白。我明白了。如果可能的话,我通常会推广使用标准版本的boost库。:)