pws*_*seo 19 c program-entry-point loops
#include <stdio.h>
int main() {
while(!DONE) {
/* check for stuff */
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
上面的代码示例使用100%cpu直到DONE为真.如何实现一个循环的程序,只在DONE时终止,但不使用100%cpu?现代语言使用像App.ProcessMessages之类的东西来让操作系统暂时控制,然后返回循环.
我是C的新手,显然......使用最新的GCC,linux和windows(便携式解决方案会很棒!)
Adr*_*aan 16
这取决于你想在这个循环中做什么.
如果你在循环中等待(即,如果按下{do something},那么你的机制会浪费系统资源而不给予任何回报.更快的处理器只会产生更多的空闲循环.这可以通过等待事件来解决不只是睡觉,而是最好是触发一些有意义的事件的事件.例如,文件操作(stdin也是一个文件)将是一个可移植的机制.这将让位于其他应用程序,直到数据可用.当你变得更具体时,它可能会被要求潜入信号量或通常依赖于操作系统的信号.抽象层可以解决这个问题.
如果你正在做一些有用的事情(即处理大量数据),那么100%cpu加载只意味着处理器以最有效的方式使用.您可以依赖操作系统让位于其他可能更高优先级的任务.
使用像sleep这样的函数会降低cpu的使用率,但你的应用程序会变慢.它需要在可接受的性能和CPU负载之间进行权衡.最大执行速度将由sleep参数定义,而不再由cpu速度定义.此外,如果关注电源(即电池寿命),那么这将需要CPU唤醒(睡眠期结束)而无需完成任何工作; 即系统资源的不同浪费.
LBu*_*kin 11
你有几个选择:
选项#2在平台/操作系统中立方式下可能很棘手.最好的办法是启动流程并在运行时环境中更改其优先级.
您的两个选项是轮询,以及某种事件通知.
轮询是最容易编程的 - 基本上你每次通过循环都会让你的线程休眠一会儿.这会将处理器释放到其他任务.缺点是你的"检查东西"代码会有延迟 - 所以如果你睡了一秒钟,它可能会在你的代码检测到这个条件之前达到一秒钟.这里的代码很容易移植.
另一个选择是等待POSIX条件,或Windows事件或类似的东西.这个代码不仅会被更改,而且"你正在检查的东西"将需要触发标志来说明它已经完成.这可能是一个不那么可移植的代码,尽管可能有一些库可以抽象出平台.但是你会立即得到事件的结果,并且不会浪费处理器时间来检查那些不存在的东西.