首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >没有100% cpu的C主循环

没有100% cpu的C主循环
EN

Stack Overflow用户
提问于 2009-08-03 14:10:47
回答 11查看 21.2K关注 0票数 21
代码语言:javascript
复制
#include <stdio.h>

int main() {
  while(!DONE) {
    /* check for stuff */
  }
  return 0;
}

上面的代码示例使用100%的cpu,直到DONE为true。我如何才能实现一个循环并在完成后才终止的程序,但它不使用100%的cpu?现代语言使用App.ProcessMessages之类的东西来让操作系统暂时获得控制权,然后返回循环。

我是C的新手,很明显...使用最新的GCC,linux和windows (一个可移植的解决方案会很棒!)

EN

回答 11

Stack Overflow用户

回答已采纳

发布于 2009-08-03 14:26:28

这取决于你想在这个循环中做什么。

如果你在循环中等待(例如,如果按下键{做一些事情},那么你的机制将浪费系统资源,不会得到任何回报。更快的处理器只会产生更多的空闲循环。这可以通过等待事件来解决,而不仅仅是睡眠,最好是触发一些有意义的事情可以完成的事件。例如,文件操作(stdin也是文件)将是一种可移植机制。这将让位于其他应用程序,直到数据可用。当您变得更加具体时,可能需要深入研究通常依赖于操作系统的信号量或信号。抽象层可以解决这个问题。

如果你正在做一些有用的事情(比如处理大量数据),那么100%的cpu负载仅仅意味着处理器以最有效的方式被使用。您可以依靠操作系统来让位于其他任务,甚至可能是更高优先级的任务。

使用诸如睡眠之类的功能将降低cpu使用率,但您的应用程序将变得更慢。这将需要在可接受的性能和cpu负载之间进行权衡。最大执行速度将由您的睡眠参数定义,而不再由cpu速度定义。此外,如果电源是一个问题(即电池寿命时间),则这将要求cpu唤醒(休眠周期结束)而不进行任何工作;即系统资源的另一种浪费。

票数 16
EN

Stack Overflow用户

发布于 2009-08-03 14:16:08

您有几个选择:

  1. 使用

()强制进程定期挂起,并允许其他进程使用CPU

  1. 以较低的优先级运行-这将导致操作系统分配较少的CPU时间
  2. 使用互斥量或其他同步对象来检测工作何时可用-这将使进程不会消耗任何CPU时间,除非它实际正在做工作
  3. 如果您获得工作的速度快于处理速度,则您可能仍需要使用某种休眠/优先级模型来避免完全消耗CPU。

选项#2可能很难以平台/操作系统中立的方式完成。最好的方法是启动进程并在运行时环境中更改其优先级。

票数 12
EN

Stack Overflow用户

发布于 2009-08-03 14:15:39

您的两个选项是轮询和某种事件通知。

轮询是最容易编程的--基本上,每次通过循环都会让线程休眠一小段时间。这会将处理器释放到其他任务。缺点是“检查东西”代码会有延迟--所以如果你睡了一秒钟,在你的代码检测到这种情况之前可能需要一秒。您的代码在这里将很容易移植。

另一种选择是等待POSIX条件事件或Windows事件或类似的事件。不仅这段代码会被更改,而且“你正在检查的东西”还需要触发标志来表明它已经完成了。这可能会降低代码的可移植性,尽管可能会有一些库来抽象化平台。但是您将立即得到事件的结果,并且不会浪费处理器时间来检查不存在的东西。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1222574

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档