我最近遇到了在一段确切的时间内睡眠当前线程的需要。我知道在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));
答案 0 :(得分:26)
我能想到的使用提升的几个原因:
boost::this_thread::sleep()
是一个
boost.thread中的中断点boost::this_thread::sleep()
可以
drop-in替换为C ++ 0x
std::this_thread::sleep_until()
in
将来为什么不 - 如果您根本不使用线程,或者项目中的其他所有内容都使用POSIX调用,那么nanosleep()
会更有意义。
至于精度,在我的系统上,boost和nanosleep()都调用相同的系统调用hrtimer_nanosleep()
。我想提升作者试图在每个系统上获得最高精度,对我而言,它恰好与nanosleep()
提供的一样。
答案 1 :(得分:5)
因为你的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::this_thread::sleep()
是使用nanosleep()
实现的。他们只为你照顾所有疯狂的角落案件。
答案 2 :(得分:4)
有没有理由不使用Boost方法
我认为这很明显,但我能想到的唯一原因是你需要提升来编译你的项目。
答案 3 :(得分:2)
对我来说,使用boost变体的主要原因是平台独立性。例如,如果您需要为posix和Windows平台编译应用程序,则平台睡眠是不够的。