boost :: this_thread :: sleep_for может зависать при использовании pthreads и откат времени системного времени - PullRequest
0 голосов
/ 25 апреля 2019

Когда я звоню (в 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?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...