如何闲置C程序

问题描述 投票:1回答:2

我用C编写了一个CPU密集型程序,以在Windows上运行。在主循环中,我检查是否有键盘按键可以让您中断执行以暂停程序。想法是,如果程序使计算机速度减慢太多,则将线程释放给其他进程。按下键盘后,我等待使用fgets()进行更多键盘输入,这使您可以稍后重新启动程序。这确实可以很好地减少任务管理器中显示的CPU使用率。但是我想知道是否可能有一种更明确的方式告诉操作系统,此过程暂时不需要任何注意,以将空闲时的开销减少到绝对最低。

我的理解是,操作系统会定期让进程运行,然后在一定时间后停止运行。然后,它以相同的方式检查其余过程,直到再次回到这一过程为止。如果有足够的工作要做,该过程将在允许的最大时间内运行。否则,它将提早停止并将控制权返回给操作系统。因此,如果没有键盘输入,则像fgets这样的函数必须立即返回控制权,这就是为什么进程以接近0%的CPU运行的原因。因此,我想问我的问题的另一种方式是我如何用自己的代码故意将控制权返回给操作系统。

c windows operating-system
2个回答
0
投票

您可以通过两种方式完成此操作。使用诸如fgets之类的阻止功能来读取输入,或者使用非阻止功能来读取输入。在第二种情况下,您需要合并某种超时。某些功能为您执行此操作,例如select。否则,您需要定期休眠进程或线程。

有效地,系统正在使用中断来确定哪些进程关心特定事件。


0
投票

我的问题是我如何用自己的代码故意将控制权还给操作系统

您可以使用Sleep(0)SwitchToThread()。两者都将控制权交还给OS,并且可能导致调用线程放弃剩余的时间片,但细节决定成败。

Sleep(0)

如果没有其他具有匹配优先级的线程准备运行,则调用立即返回。否则,线程将放弃其剩余时间片。

您可以使用SwitchToThreadSleep(1)解决优先级问题。后者的缺点是,无论其他线程是否准备好运行,该线程都会无条件地放弃其时间片。

SwitchToThread()

如果没有其他线程,无论其优先级如何,都可以在该线程的当前处理器上运行,则该调用立即返回。否则,线程最多放弃一个时间片的剩余时间片。

© www.soinside.com 2019 - 2024. All rights reserved.