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

标签 c++ macos boost osx-mavericks

我的程序的一部分需要休眠 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/

相关文章:

macos - 如何在 Homebrew 软件上构建带有 mpi 支持的 boost?

boost::make_shared<T>(...) 不编译, shared_ptr<T>(new T(...)) 编译

c++ - TDD 让我除以零。可以吗?

c++ - Qt setColumnWidth 不起作用

c++ - 这个 Singleton 替代方案好吗?

JDK 1.8.0_161 中的 Java Mission Control 在 Mac OS X 上启动时卡住

c++ - boost::asio 的线程安全性如何?

c++ - 为什么 c++ 指针 * 关联到声明的变量,而不是类型?

firefox - 如何使用 Selenium RC 关闭或最小化浏览器窗口?

objective-c - 从 OS X 命令行编译和链接 Swift 和 Objective C 代码