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

Jus*_*ini 20 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);
Run Code Online (Sandbox Code Playgroud)

提升方法:

#include <boost/date_time/posix_time/posix_time.hpp>
#include <boost/thread/thread.hpp> 
...
boost::this_thread::sleep(boost::posix_time::nanoseconds(1000));
Run Code Online (Sandbox Code Playgroud)

Cub*_*bbi 26

我能想到的使用提升的几个原因:

  • boost::this_thread::sleep() 是boost.thread中的中断点
  • boost::this_thread::sleep()可以std::this_thread::sleep_until()在将来用C++ 0x取代

为什么不 - 如果您根本不使用线程,或者项目中的其他所有内容都使用POSIX调用,那么nanosleep()更有意义.

至于精度,在我的系统上,boost和nanosleep()都调用相同的系统调用,hrtimer_nanosleep().我想提升作者试图在每个系统上获得最高的精度,对我来说,它恰好与提供的一样nanosleep().

  • +1 - 应该注意的是,基于线程休眠的时序 - 甚至纳米睡眠 - 充其量是不可靠的. (6认同)

def*_*ode 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;
}
Run Code Online (Sandbox Code Playgroud)

不可否认,如果你只是睡了1微秒,过早醒来应该不是问题,但在一般情况下,这是完成它的唯一方法.

只是为了加强对蛋糕的青睐,boost::this_thread::sleep()是用来实现的nanosleep().他们只为你照顾所有疯狂的角落案件.