#include <stdio.h>

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

上述代码样本使用100%cpu直所做的是正确的。我如何可以实施一个程序,循环,只有终止的时候完成,但其中不使用100%的cpu?现代语文的使用类似程序。ProcessMessages或类似的东西给操作系统控制的那一刻,然后返回循环。

我是新C,很明显...使用最新的海湾合作委员会,linux和windows(便携式解决方案将是伟大的!)

有帮助吗?

解决方案

这取决于你想要这个循环里做什么。

如果您在循环中等待(即,如果在keyPressed {做某事}那么你的机制会浪费系统资源给任何回报。更快的处理器只会让更多的空闲循环。这可以通过等待事件解决的不只是睡眠,但最好的事件,其触发点有意义的事情可以做。例如,文件操作(标准输入也是一个文件)将是一个可移植的机制。直到数据可用这将让位给其他应用程序。当你变得更具体可能需要潜入信号量或这往往取决于操作系统信号。一个抽象层可以解决这个问题。

如果你正在做的事情有用(即处理大量的数据),然后用100%的CPU负载只是意味着所述处理器被以最有效的方式使用。你可以依靠操作系统上让位给其他和可能更高优先级的任务。

使用像睡眠的功能将降低CPU使用率,但你的应用将变慢。这将需要获得可接受的性能和CPU负载之间的权衡。最大的执行速度会被你的睡眠参数由CPU的速度来定义,而不再。此外,如果功率是一个问题(即电池的寿命时间),则这将需要的CPU的唤醒(睡眠期结束),没有要完成的工作;即系统资源的浪费不同

其他提示

你有几种选择:

  1. 使用sleep()对武力的过程暂停期,并允许其他过程中使用的CPU
  2. 运行在一个较低优先级,这将导致操作系统分配更少的时间CPU
  3. 使用互斥或其他同步目来检测工作提供--这将保持过程中消耗的任何存在,除非它实际上是做的工作
  4. 如果你得到的工作速度比你可以处理-您可能仍会需要使用某种休眠/优先模式到完全避免消耗。

选项2可能是棘手做一个平台/OS中性的方式。你最好的赌注是启动该进程并改变其优先事项的运行环境。

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

轮询是最简单的方案 - 基本上你有你的线程睡一小会儿每次通过循环。这将释放处理器的其他任务。缺点是会出现在你的“检查的东西”代码延迟 - 所以,如果你睡了一秒钟,你的代码检测条件之前它可能是直到第二。在这里你的代码将很容易地移植。

在另一种选择是等待一个POSIX条件,或Windows事件或类似的东西。这不仅将代码进行更改,但随后的“的东西,你正在检查”将需要触发旗说,这是完成。这将是一个有点不太可移植的代码,虽然有可能是库抽象出来的平台。但你会得到立竿见影的效果的情况下,以及事情是不是有没有浪费处理器时间检查。

究竟是什么,你的检查?

如果你正在检查一些挥发性由硬件或其他进程改变了,只需拨打sleep在循环。

如果您是在文件描述符或网络socket描述符等,你将要使用selectpoll在循环等待描述符有现成的数据消费。

如果我的理解没错,你在DONE可以从其他线程改变的评论说。如果是这样,条件变量是有意义的。与并行线程,一个会做:

在该等待线程:

pthread_mutex_lock(&mutex);
while (!DONE) {
     pthread_cond_wait(&cond, &mutex);
}
pthread_mutex_unlock(&mutex);

在其他线程,DONE被改变时:

pthread_mutex_lock(&mutex);
DONE = 1;
pthread_cond_signal(&cond);
pthread_mutex_unlock(&mutex);

使用

睡眠(INT毫秒)

Sleep(0);将足以我想

使用收率()。

如果我猜正确的(我不知道这件事),App.ProcessMessages相当于是做阻塞的IO。正如我不知道C对多任务,它使用轮询OS任何实现的,任何标准的C IO应该是安全的。

在窗口中,可以使用的Sleep(INT毫秒),在WINDOWS.H定义。

睡眠(0);是足够的

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top