【发布时间】:2020-09-08 23:05:07
【问题描述】:
我用 C 语言编写了一个 CPU 密集型程序以在 Windows 上运行。在主循环中,我检查键盘是否按下以允许您中断执行以暂停程序。这个想法是如果程序使计算机速度过慢,则将线程释放给其他进程。按下键盘后,我使用 fgets() 等待更多键盘输入,这允许您稍后重新启动程序。这确实很好地减少了任务管理器中显示的 CPU 使用率。但我想知道是否有更明确的方法可以告诉操作系统此进程暂时不需要任何关注,以便将空闲时的开销降至最低。
我的理解是操作系统会定期让进程运行,然后在一定时间后停止运行。然后它以同样的方式检查其余的进程,直到它再次回到这个进程。如果它有足够的时间,该过程将运行最大允许时间。否则,它将提前停止并将控制权返回给操作系统。因此,如果没有键盘输入,像 fgets 这样的函数必须立即返回控制权,这就是为什么进程以接近 0% 的 CPU 运行的原因。所以我想问我问题的另一种方式是如何在我自己的代码中故意将控制权返回给操作系统。
【问题讨论】:
-
也许只是为你的线程设置了一个低优先级?
-
一般来说,您应该将 CPU 密集型工作卸载到另一个线程(可能降低优先级),并在您的“主线程”中处理用户界面,(特别是如果主线程是处理 GUI)。您的工作线程可以轮询原子“暂停”布尔值(比 KB I/O 轮询快得多),如果设置,则等待事件或信号量同步,直到主线程重置“暂停”并发出同步信号。跨度>
-
需要重复系统调用的解决方案既浪费又不必要,使用超时的解决方案更糟。在 CPU 密集型任务循环中,无需再做任何事情,只需测试一个原子布尔值以查看是否已设置。
-
如果某个答案帮助您解决了问题,请考虑接受。
标签: c windows operating-system