什么可以使 nanosleep 在 mac OS X 10.9 上精确漂移 10 秒

thw*_*ang 3 c++ macos boost osx-mavericks

我的程序的一部分需要休眠 10 毫秒。通常我为此使用 boost lib,但它有时会休眠 10010 毫秒,所以我尝试更换

boost::this_thread::sleep_for(boost::chrono::milliseconds(read_delay_ms));
Run Code Online (Sandbox Code Playgroud)

struct timespec a;
a.tv_sec  = 0;
a.tv_nsec = read_delay_ms * 1000000;
int rc = nanosleep( &a, NULL );
Run Code Online (Sandbox Code Playgroud)

毫不奇怪,使用 nanosleep 有时也会休眠 10010 毫秒(sleep_for 在 mac 上使用 nanosleep() 实现)。

我的程序很复杂,所以我无法创建一个小例子来说明这个问题,我正在研究这个。以下是一些亮点:

  • 它是使用 boost::python 作为桥接器用 C++ 编写的 python 扩展

  • 将 boost::threads 用于使用 boost::asio 的异步任务

该问题仅在 mac OS X 10.9 上出现。它在 Mac OS X 10.8 及更低版本上看不到,在 linux、win、iOS 和 android 上看不到。

为了在我的代码、boost lib 或 sys 函数中找到错误,任何帮助或建议都更受欢迎。

ham*_*ene 5

App Nap 很可能是造成这种情况的原因。它是在 10.9 中引入的,并且已经以引起此类意外而闻名。

NSProcessInfo新增了三种暂时禁用 App Nap 的方法:beginActivityWithOptions:reason:endActivity:performActivityWithOptions:reason:block:

您还可以通过将布尔值 YES 写入NSAppSleepDisabled应用程序域的用户默认值来禁用它。