Когда я звоню (в 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, включая libboost из репозиториев Debian), boost вызывает для pthread_delay_np()
.
Из описания pthread_delay_np выглядит так, как будто оно должно зависнуть, когда мы переходимназад:
Эта процедура заставляет поток задерживать выполнение на определенный интервал времени.Этот интервал заканчивается в текущее время плюс указанный интервал.Процедура не вернется, пока не будет достигнут конец интервала
Но описание boost sleep_for выглядит как устойчивые часы:
Приостанавливает текущий поток до продолжительностиуказанный rel_time истек.
Я ожидаю, что sleep_for
- это устойчивые часы.Это проблема с бустом, или я должен перекомпилировать буст без BOOST_HAS_PTHREAD_DELAY_NP
?