代码之家  ›  专栏  ›  技术社区  ›  Justin Ardini

boost::这个线程::sleep()和nanosleep()的比较?

  •  20
  • Justin Ardini  · 技术社区  · 15 年前

    nanosleep() 或使用 boost::this_thread::sleep()

    出于好奇,我想知道这两种方法有什么区别。在精度上有什么不同吗?有什么原因吗 使用Boost方法?

    方法:

    #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 回复  |  直到 10 年前
        1
  •  26
  •   Cubbi    15 年前

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

    • boost::this_thread::sleep() boost.thread中的中断点
    • boost::这个线程::sleep() 用C++ 0x替换掉 std::this_thread::sleep_until() 未来

    为什么不呢——如果您根本不使用线程,或者您的项目中的其他所有东西都使用POSIX调用,那么 nanosleep() 更有意义。

    至于精度,在我的系统上boost和nanosleep()都调用同一个系统调用, hrtimer_nanosleep() 纳米睡眠()

        2
  •  5
  •   hlovdal    10 年前

    因为你的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() . 他们只是帮你处理了所有疯狂的街角案件。

        3
  •  4
  •   Billy ONeal IS4    15 年前

    有什么理由不使用Boost方法吗

    我想这是显而易见的,但我能想到的唯一原因是编译项目需要boost。

        4
  •  2
  •   MM.    11 年前