boost :: this_thread :: sleep () против nanosleep ()? - PullRequest
20 голосов
/ 19 июня 2010

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

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

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));

Ответы [ 4 ]

26 голосов
/ 19 июня 2010

Несколько причин, почему я использую надстройку, я могу придумать:

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

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

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

5 голосов
/ 19 июня 2010

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

#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::this_thread::sleep() реализован с использованием nanosleep(). Они просто позаботились обо всех безумных уголках для тебя.

4 голосов
/ 19 июня 2010

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

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

2 голосов
/ 03 апреля 2014

Для меня основной причиной использования варианта boost является независимость от платформы. Например, если вам необходимо скомпилировать приложение для платформ posix и Windows, спящего режима недостаточно

...