C主循环没有100%cpu

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唤醒(睡眠期结束)而无需完成任何工作; 即系统资源的不同浪费.

  • 主循环内部有什么样的处理?消息,信号,信号量与基础语言的操作系统更相关.例如,http://www.ibm.com/developerworks/eserver/library/es-win32linux-sem.html显示了如何在Windows和Linux中处理信号量.如果您需要同时支持两者,您可以使用POSIX(对于Windows是可选的,即在cygwin中),或者将代码放在您为每个操作系统创建的平台相关模块中. (2认同)

LBu*_*kin 11

你有几个选择:

  1. 使用sleep()强制进程定期挂起并允许其他进程使用CPU
  2. 以较低优先级运行 - 这将导致操作系统分配较少的CPU时间
  3. 使用互斥锁或其他同步对象来检测工作何时可用 - 这将使进程不会消耗任何CPU时间,除非它实际上正在工作
  4. 如果您的工作速度超过了处理速度 - 您可能仍需要使用某种睡眠/优先级模型来避免完全消耗CPU.

选项#2在平台/操作系统中立方式下可能很棘手.最好的办法是启动流程并在运行时环境中更改其优先级.


Cly*_*yde 6

您的两个选项是轮询,以及某种事件通知.

轮询是最容易编程的 - 基本上你每次通过循环都会让你的线程休眠一会儿.这会将处理器释放到其他任务.缺点是你的"检查东西"代码会有延迟 - 所以如果你睡了一秒钟,它可能会在你的代码检测到这个条件之前达到一秒钟.这里的代码很容易移植.

另一个选择是等待POSIX条件,或Windows事件或类似的东西.这个代码不仅会被更改,而且"你正在检查的东西"将需要触发标志来说明它已经完成.这可能是一个不那么可移植的代码,尽管可能有一些库可以抽象出平台.但是你会立即得到事件的结果,并且不会浪费处理器时间来检查那些不存在的东西.