повышение:: this_thread:: сон () по сравнению с наносном ()?

Я недавно столкнулся с потребностью спать текущий поток в течение точного промежутка времени. Я знаю о двух методах выполнения так на платформе POSIX: использование nanosleep() или использование boost::this_thread::sleep().

Из любопытства больше, чем что-либо еще я задавался вопросом, что различия между двумя подходами. Есть ли какое-либо различие в точности и там какая-либо причина не использовать подход Повышения?

nanosleep() подход:

#include <time.h>
...
struct timespec sleepTime;
struct timespec returnTime;
sleepTime.tv_sec = 0;
sleepTime.tv_nsec = 1000;
nanosleep(&sleepTime, &returnTime);

Подход повышения:

#include <boost/date_time/posix_time/posix_time.hpp>
#include <boost/thread/thread.hpp> 
...
boost::this_thread::sleep(boost::posix_time::nanoseconds(1000));
20
задан sergtk 5 March 2015 в 22:36
поделиться

3 ответа

Несколько причин использовать boost, о которых я могу думать:

  • boost::this_thread::sleep() - это точка прерывания в boost.thread
  • boost::this_thread::sleep() может быть быть заменен на C++0x std::this_thread::sleep_until() in в будущем

Почему нет - если вы вообще не используете потоки, или все остальное в вашем проекте использует вызовы POSIX, то nanosleep() имеет больше смысла.

Что касается точности, то в моей системе и boost, и nanosleep() вызывают один и тот же системный вызов, hrtimer_nanosleep(). Я представляю, как авторы boost пытаются добиться максимально возможной точности на каждой системе, и для меня это совпадает с тем, что обеспечивает nanosleep().

26
ответ дан 30 November 2019 в 00:04
поделиться

Как насчет того, что ваш пример с nanonsleep неверен.

#include <time.h>
...
struct timespec sleepTime;
struct timespec time_left_to_sleep;
sleepTime.tv_sec = 0;
sleepTime.tv_nsec = 1000;
while( (sleepTime.tv_sec + sleepTime.tv_nsec) > 0 )
{
   nanosleep(&sleepTime, &time_left_to_sleep);
   sleepTime.tv_sec = time_left_to_sleep.tv_sec;
   sleepTime.tv_nsec = time_left_to_sleep.tv_nsec;
}

По общему признанию, если вы спите всего 1 микросекунду, слишком раннее пробуждение не должно быть проблемой, но в общем случае это единственный способ сделать это.

И просто чтобы заморозить пирог в пользу Boost, boost :: this_thread :: sleep () реализован с использованием nanosleep () . Они просто позаботились обо всех безумных угловых делах за вас.

5
ответ дан 30 November 2019 в 00:04
поделиться

есть ли причины не использовать подход Boost

Я полагаю, что это очевидно, но единственная причина, о которой я могу думать, это то, что вам потребуется boost для компиляции вашего проекта.

4
ответ дан 30 November 2019 в 00:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: