什么会导致线程在 Mac OS 上被限制为 25%?

What can cause a thread to be throttled to 25% on Mac OS?

我在 Mac OS X 上有一个 C++ 应用程序。该应用程序 运行 在主线程上使用 glfw 库进行事件处理,并在一个线程上读取输入和执行命令背景 C++ std::thread。 我正在观察一个我目前无法解释的令人沮丧的现象。 如果我在后台线程上调用一个 long 运行ning 函数,最初该线程会使用 100% 的核心。但是,在它使用了几秒钟后 CPU(10 似乎是神奇的阈值),它被限制到 25%。

如果我在启动 glfw 事件处理循环之前在后台的一个线程上开始计算 运行(事件处理基本上是在等待事件,因为我什至没有打开 window), 然后它可以使用 100%,想用多久就用多久。

我最大的问题是我不知道是什么原因造成的,也不知道如何解决。我已经测试过检索 pthread sched_param 并将 sched_priority 从似乎默认的 31 更改为 20 到 60 之间的各种值,但没有帮助。

我已经确定了该现象发生的另一个条件: 后台线程必须从终端读取。当我 运行 以下后台线程并输入一行以进行计算时,就会发生这种情况:

std::thread cmd([argc, argv, &scriptingRunner] {
      for (std::string line; std::getline(std::cin, line); ) {
          longComputation();
      }

也许 App Nap 正在限制您的应用程序以节省能源。要检查,请打开进程 header 上的 Activity 监控程序和 right-click table 以调出上下文菜单,然后单击上下文中的“App Nap”启用 App Nap 列的菜单;然后在table中查看你的进程,当故障发生时,它在App Nap列中的值是否切换为“是”。

如果您想为您的应用禁用应用小睡,请参阅问题 here 中列出的代码。