Подтвердить что ты не робот

Boost:: this_thread:: sleep() vs nanosleep()?

Недавно я столкнулся с необходимостью скрыть текущий поток за определенный период времени. Я знаю два способа сделать это на платформе 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));
4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

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

Ответ 3

Есть ли какая-либо причина не использовать подход Boost

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

Ответ 4

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