C++;While loop,usleep()/sleep()如何不使用90%的CPU?(Ubuntu 12.04) 假设我有C++代码,比如 #include "myheaderfiles.h" //..some stuff //...some more stuff int main() { double milliseconds; int seconds; int minutes; int timelimit=2; ... ... //...code here that increments //.....milliseconds,seconds, and minutes while(minutes <=timelimit) { //...do stuff if(milliseconds>500) { //...do stuff //...every half second } //end if } //end while }//end main #包括“myheaderfiles.h” //…一些东西 //……再来点东西 int main() { 双毫秒; 整数秒; 整数分钟; int timelimit=2; ... ... //…在这里输入递增的代码 //…毫秒、秒和分钟 同时(500分钟) { //…做事 //…每半秒 }//如果结束,则结束 }//结束时 }//端干管

C++;While loop,usleep()/sleep()如何不使用90%的CPU?(Ubuntu 12.04) 假设我有C++代码,比如 #include "myheaderfiles.h" //..some stuff //...some more stuff int main() { double milliseconds; int seconds; int minutes; int timelimit=2; ... ... //...code here that increments //.....milliseconds,seconds, and minutes while(minutes <=timelimit) { //...do stuff if(milliseconds>500) { //...do stuff //...every half second } //end if } //end while }//end main #包括“myheaderfiles.h” //…一些东西 //……再来点东西 int main() { 双毫秒; 整数秒; 整数分钟; int timelimit=2; ... ... //…在这里输入递增的代码 //…毫秒、秒和分钟 同时(500分钟) { //…做事 //…每半秒 }//如果结束,则结束 }//结束时 }//端干管,c++,while-loop,cpu,usleep,C++,While Loop,Cpu,Usleep,该程序将运行良好,并做它应该做的事情,但它将使用90%以上的我的cpu 有人建议我在我的while循环中每隔100毫秒左右使用usleep(),因为我实际上只关心每隔500毫秒做一次事情。这样,当不需要CPU时,它就会占用CPU 所以我像这样把它添加到我的while循环中 while(minutes <=timelimit) { //...do stuff if(milliseconds>500) { //...do

该程序将运行良好,并做它应该做的事情,但它将使用90%以上的我的cpu

有人建议我在我的while循环中每隔100毫秒左右使用usleep(),因为我实际上只关心每隔500毫秒做一次事情。这样,当不需要CPU时,它就会占用CPU

所以我像这样把它添加到我的while循环中

   while(minutes <=timelimit)
   {
      //...do stuff
      if(milliseconds>500)
      {
         //...do stuff 
         //...every half second
      } //end if
      usleep(100000);
   } //end while
while(500分钟)
{
//…做事
//…每半秒
}//如果结束,则结束
美国LEEP(100000);
}//结束时
它编译得很好,但当我运行它时,程序将挂在usleep上,永远不会返回。我在某个地方读到,在调用usleep之前,需要刷新所有缓冲区,所以我刷新了所有文件流和couts等。仍然没有运气

我已经找了两天的解决方案。我也用过sleep(),运气不好

我找到了一些替代方案,但它们看起来很复杂,并且会给我的程序添加很多我并不完全理解的代码,这些代码会使程序复杂化,变得凌乱,而且可能无法工作

我以前从来没有在while()循环中花太多心思,因为我写的大多数程序都是为微控制器或FPGA编写的,这对占用处理器没有问题


如果有人能帮忙。。。。有资源、链接、书籍吗?谢谢。

这段代码对我来说工作正常(不过是在OSX上运行)

#包括
#包括
int main(){

std::cout您的方法有些错误。一个程序应该消耗90-100%的CPU,只要它有一些有用的事情要做(否则它应该阻塞,消耗零CPU)。
在这两者之间睡眠会导致执行时间过长,而且消耗的能量比尽可能快地完成工作(100%的CPU)然后完全阻塞,直到有更多的工作可用,或者直到发生其他重要的事情(例如,半秒钟过去了,如果这对您很重要的话)要多

考虑到这一点,以如下概念的方式构建您的程序:

while(blocking_call() != exit_condition)
{
    while(have_work)
        do_work();
}
此外,在执行过程中不要睡觉,而是使用计时器(例如)定期做一些事情。这不仅效率更高,而且更加精确和可靠


具体如何实现这一点取决于您希望软件的可移植性。例如,在Ubuntu/Linux下,您可以将
epoll\u wait
等API与
eventfd
一起使用,而不是为计时器编写信号处理程序。

这是一个逻辑问题,或者您可能正在制作多个计数器?因为您说过您已经完成了microcontrollers,我假设你在调用系统计时器时试图使用时钟周期作为计数方法?还有,我想问的是,如果建议你使用usleep(x),为什么要使用双精度毫秒?usleep(1)是1微秒==1000毫秒。睡眠(x)是每秒一个计数器,因此系统将暂停当前任务x秒

#include <iostream>
#include <unistd.h>

using namespace std;

#define MILLISECOND 1000
#define SECOND 1000*MILLISECOND

int main(int argc, char *argv[]){
    int time = 20;
    int sec_counter = 0;
    do{     
        cout<<sec_counter<<" second"<<endl;
        usleep(SECOND);
        sec_counter++;
    } while(sec_counter<time+1);
    return 0;
}
#包括
#包括
使用名称空间std;
#定义毫秒1000
#定义秒1000*毫秒
int main(int argc,char*argv[]){
整数时间=20;
整数秒计数器=0;
做{

请告诉我您没有使用CPU时钟来测量时间…您可以显示完整的while()循环吗。这可能有很多原因,这就是所谓的忙循环问题。usleep()不会导致任何挂起。您的代码中还有其他错误。我想知道--程序是否需要做些什么,或者只是在某个地方进行无聊的轮询?如果需要做些什么,加快完成速度应该不会有什么坏处(在*nix或windows上,您可以关闭prio)。如果您正在轮询,可能有一个事件驱动的解决方案?如果您需要,为什么不注册一个计时器,每半秒叫醒您一次?这似乎不是一个正确的解决方案。您确定它挂在usleep上吗?可能您没有正确地增加“毫秒”。您在pr中使用信号吗有没有可能?我只是想指出,1微秒并不等于1000毫秒,相反。你可能需要修改你答案的最后部分。
#include <iostream>
#include <unistd.h>

using namespace std;

#define MILLISECOND 1000
#define SECOND 1000*MILLISECOND

int main(int argc, char *argv[]){
    int time = 20;
    int sec_counter = 0;
    do{     
        cout<<sec_counter<<" second"<<endl;
        usleep(SECOND);
        sec_counter++;
    } while(sec_counter<time+1);
    return 0;
}