Я недавно столкнулся с потребностью спать текущий поток в течение точного промежутка времени. Я знаю о двух методах выполнения так на платформе 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));
Несколько причин использовать boost, о которых я могу думать:
boost::this_thread::sleep()
- это
точка прерывания в boost.threadboost::this_thread::sleep()
может быть
быть заменен на C++0x
std::this_thread::sleep_until()
in
в будущемПочему нет - если вы вообще не используете потоки, или все остальное в вашем проекте использует вызовы POSIX, то nanosleep()
имеет больше смысла.
Что касается точности, то в моей системе и boost, и nanosleep() вызывают один и тот же системный вызов, hrtimer_nanosleep()
. Я представляю, как авторы boost пытаются добиться максимально возможной точности на каждой системе, и для меня это совпадает с тем, что обеспечивает nanosleep()
.
Как насчет того, что ваш пример с 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 ()
. Они просто позаботились обо всех безумных угловых делах за вас.
есть ли причины не использовать подход Boost
Я полагаю, что это очевидно, но единственная причина, о которой я могу думать, это то, что вам потребуется boost для компиляции вашего проекта.