我的程序的一部分需要休眠 10 毫秒。通常我为此使用 boost 库,但它有时会休眠 10010 毫秒,所以我尝试更换
boost::this_thread::sleep_for(boost::chrono::milliseconds(read_delay_ms));
与
struct timespec a;
a.tv_sec = 0;
a.tv_nsec = read_delay_ms * 1000000;
int rc = nanosleep( &a, NULL );
毫不奇怪,使用 nanosleep 有时也会休眠 10010 毫秒(sleep_for 是在 mac 上使用 nanosleep() 实现的)。
我的程序很复杂,所以我无法创建一个小例子来说明这个问题,我正在努力解决这个问题。以下是一些要点:
它是一个用 C++ 编写的 python 扩展,使用 boost::python 作为桥梁
将 boost::threads 用于使用 boost::asio 的异步任务
此问题仅出现在 mac OS X 10.9 上。 Mac OS X 10.8及以下版本看不到,linux、win、iOS、android上看不到。
为了找出我的代码、boost lib 或 sys 函数中的错误,我们欢迎任何帮助或建议。
最佳答案
App Nap 很可能是造成这种情况的原因。它是在 10.9 中引入的,并且以引起此类意外而闻名。
NSProcessInfo
新增了三种临时禁用 App Nap 的方法:beginActivityWithOptions:reason:
, endActivity:
, performActivityWithOptions:reason: block :
。
您还可以通过将 bool 值 YES 写入应用程序域的 NSAppSleepDisabled
用户默认值来禁用它。
关于c++ - 什么可以使 nanosleep 在 mac OS X 10.9 上精确漂移 10 秒,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22784886/