我最近需要让当前线程精确地休眠一段时间。我知道在POSIX平台上有两种方法可以实现:使用
我只是出于好奇想知道这两种方法之间的区别。它们的精度是否有差异,有没有任何不使用Boost方法的理由?
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);
Boost方法:
#include <boost/date_time/posix_time/posix_time.hpp>
#include <boost/thread/thread.hpp>
...
boost::this_thread::sleep(boost::posix_time::nanoseconds(1000));
nanoseconds
在某些系统上不可用。使用microseconds
更为安全。 - real4xsleep_until_ms()
、sleep_until_us()
和sleep_until_ns()
感兴趣。这些是我编写的 C and C++ 兼容的包装器,用于clock_nanosleep()
——它类似于nanosleep()
,但允许您选择要使用的时钟,例如单调时钟。clock_nanosleep(CLOCK_MONOTONIC, ...)
的默认分辨率为 55 us,如果您将 Linux 调度程序policy
设置为SCHED_RR
软实时轮询调度程序,并将priority
设置为1
(最低,以避免抢占任何更高的东西),则可以将其提高到 4 us。 - Gabriel StaplesSCHED_OTHER
Linux调度程序,sleep_until_ms()
、sleep_until_us()
和sleep_until_ns()
可靠地用于重复的周期性操作,最高可达500 Hz ~ 1 KHz,而使用SCHED_RR
,您可以获得高达惊人的10 KHz ~ 100 KHz的可重复循环!(所有测试都在x86-64 CPU上运行)。请参见我在此处的答案以获取测试和详细信息,以及我的timinglib.h
和timinglib.c
文件在我的存储库中。 - Gabriel Staples