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));
Ответы
Ответ 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, например, спящий режим платформы недостаточен.