boost :: this_thread :: sleep()与nanosleep()?

时间:2010-06-18 20:40:10

标签: c++ boost posix sleep

我最近遇到了在一段确切的时间内睡眠当前线程的需要。我知道在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 个答案:

答案 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平台编译应用程序,则平台睡眠是不够的。