C++ While 循环,usleep()/sleep() 如何不使用 90% 的 CPU? (Ubuntu 12.04)

标签 c++ while-loop cpu usleep

假设我有 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

该程序将运行良好并执行它应该执行的操作,但它会占用我 90% 以上的 CPU。

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

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

   while(minutes <=timelimit)
   {
      //...do stuff
      if(milliseconds>500)
      {
         //...do stuff 
         //...every half second
      } //end if
      usleep(100000);
   } //end while

它编译得很好,但是当我运行它时,程序会在 usleep 挂起并且永远不会返回。我在某处读到,在调用 usleep 之前,需要刷新所有缓冲区,所以我刷新了所有文件流和 cout 等。仍然没有运气。

我已经搜索了 2 天的解决方案。我也用过 sleep() ,但没有运气。

我找到了一些替代方案,但它们看起来很复杂,并且会在我的程序中添加很多我并不完全理解的代码,这会使它变得复杂并变得困惑,而且它可能无法运行。

我以前从来没有真正在我的 while() 循环中考虑太多,因为我编写的大部分程序都是针对微 Controller 或 FPGA 的,这不会占用处理器。

如果有人可以提供帮助……任何资源、链接、书籍?谢谢。

最佳答案

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

考虑到这一点,按照概念上的方式构建您的程序:

while(blocking_call() != exit_condition)
{
    while(have_work)
        do_work();
}

此外,不要在执行期间休眠,而是使用计时器(例如 setitimer )定期执行某些操作。这不仅会更有效率,而且会更加精确和可靠。

具体实现方式取决于您希望软件的便携性。例如,在 Ubuntu/Linux 下,您可以将 epoll_wait 等 API 与 eventfd 一起使用,而不是为计时器编写信号处理程序。

关于C++ While 循环,usleep()/sleep() 如何不使用 90% 的 CPU? (Ubuntu 12.04),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23024090/

相关文章:

multithreading - 多核 CPU、多线程和上下文切换?

mysql - 限制 MySQL 用户的 CPU/内存使用

x86 - 为什么 "i586"指的是 Pentium 1,为什么 "i686"指的是 Pentium Pro?

c++ - VS2019 c++深度继承模板中的C3861错误

c++ - 如何使用 Eclipse CDT 自动从命名空间中取出一个类?

python - 变量在某个地方失去了它的值(value)

php - 如何使用 php 从选择查询中插入数据

c++ - 二叉搜索树上的范围查询(递归)

c++ - 互斥锁会停止 mingw 中的程序,但不会在 Linux 上停止

java - Java 中的符号表