当我在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
的情况下重新编译增强?