#include <stdio.h>
int main() {
while(!DONE) {
/* check for stuff */
}
return 0;
}上面的代码示例使用100%的cpu,直到DONE为true。我如何才能实现一个循环并在完成后才终止的程序,但它不使用100%的cpu?现代语言使用App.ProcessMessages之类的东西来让操作系统暂时获得控制权,然后返回循环。
我是C的新手,很明显...使用最新的GCC,linux和windows (一个可移植的解决方案会很棒!)
发布于 2009-08-03 14:26:28
这取决于你想在这个循环中做什么。
如果你在循环中等待(例如,如果按下键{做一些事情},那么你的机制将浪费系统资源,不会得到任何回报。更快的处理器只会产生更多的空闲循环。这可以通过等待事件来解决,而不仅仅是睡眠,最好是触发一些有意义的事情可以完成的事件。例如,文件操作(stdin也是文件)将是一种可移植机制。这将让位于其他应用程序,直到数据可用。当您变得更加具体时,可能需要深入研究通常依赖于操作系统的信号量或信号。抽象层可以解决这个问题。
如果你正在做一些有用的事情(比如处理大量数据),那么100%的cpu负载仅仅意味着处理器以最有效的方式被使用。您可以依靠操作系统来让位于其他任务,甚至可能是更高优先级的任务。
使用诸如睡眠之类的功能将降低cpu使用率,但您的应用程序将变得更慢。这将需要在可接受的性能和cpu负载之间进行权衡。最大执行速度将由您的睡眠参数定义,而不再由cpu速度定义。此外,如果电源是一个问题(即电池寿命时间),则这将要求cpu唤醒(休眠周期结束)而不进行任何工作;即系统资源的另一种浪费。
发布于 2009-08-03 14:16:08
您有几个选择:
()强制进程定期挂起,并允许其他进程使用CPU
选项#2可能很难以平台/操作系统中立的方式完成。最好的方法是启动进程并在运行时环境中更改其优先级。
发布于 2009-08-03 14:15:39
您的两个选项是轮询和某种事件通知。
轮询是最容易编程的--基本上,每次通过循环都会让线程休眠一小段时间。这会将处理器释放到其他任务。缺点是“检查东西”代码会有延迟--所以如果你睡了一秒钟,在你的代码检测到这种情况之前可能需要一秒。您的代码在这里将很容易移植。
另一种选择是等待POSIX条件事件或Windows事件或类似的事件。不仅这段代码会被更改,而且“你正在检查的东西”还需要触发标志来表明它已经完成了。这可能会降低代码的可移植性,尽管可能会有一些库来抽象化平台。但是您将立即得到事件的结果,并且不会浪费处理器时间来检查不存在的东西。
https://stackoverflow.com/questions/1222574
复制相似问题