【问题标题】:What is a busy loop?什么是忙循环?
【发布时间】:2011-02-06 03:39:40
【问题描述】:

可以是有或没有语句的循环吗?

while (1)
{
   //Empty
}

或

int i = 0;

while (1)
{
   i++;
}

【问题讨论】:

  • 由于您的两个示例都会占用接近 100% 的 CPU,因此我将它们称为非常繁忙的循环。最小循环将包括睡眠或其他任务。
  • 如何防止它被优化掉:stackoverflow.com/questions/7083482/…
  • 这两个示例都按原样屈服于 UB。第二次签名溢出,两者都使用Is empty loop UB。

标签: c++


【解决方案1】:

“忙循环”或更常见的“忙等待”是一种主动轮询,其中应用程序正在等待某个事件发生并不断检查它。通常这包括定时睡眠或其他放弃 CPU 时间的任务,以便另一个进程可以提供预期的输入。

将此与回调进行对比。在等待回调时,程序不消耗 CPU 周期。通常,程序会“注册”一个回调例程,某个监控应用程序会根据某些事件调用该例程。

区别在于忙循环中的程序在等待时消耗 CPU 和时间片,而回调机制允许程序在等待时不消耗(或几乎不消耗)CPU。

【讨论】:

  • 但是实现回调机制的程序难道不是还需要运行一个繁忙的循环才能知道何时触发回调吗?这如何更有效?
  • 一个例子是使用 HTTP 与 MQTT 的 pub/sub 之间的区别。基于 HTTP 的客户端需要轮询 HTTP 服务器,如果需要响应,则每秒左右进行一次。 MQTT 客户端建立一个套接字并监听它。 MQTT 服务器在准备好时发送数据。如果客户端碰巧在手机上,在 CPU 利用率、带宽利用率和电池寿命方面的差异是巨大的。 HTTP 版本实现了忙循环,MQTT 版本实现了阻塞的 TCP 调用或带有套接字的线程保持等待状态的回调。
  • 我明白你在摘要中所说的话。我只是对如何在具体到硬件中实现这一点感到困惑。某些东西必须仍在轮询,因为从根本上说,要对其他东西做出反应,它必须检查其他东西是否发生了正确的事?
  • 当然。问题是它是包含在应用程序的代码中还是归入操作系统或硬件之类的其他东西。如果应用程序进行了阻塞调用,那么他的操作系统会将其唤醒。如果应用程序在硬件级别注册了一个中断,那么当中断引脚变为高电平时,CPU 会跳转到该代码。在任何一种情况下,应用程序等待时发生的事情的逻辑都不包含在应用程序中。
【解决方案2】:

对我来说,繁忙的循环是一个永不阻塞的循环。

阻塞是操作系统提供的一种行为,它允许线程消耗 NO cpu 周期,直到满足某些条件(条件变量发出信号,或者可能只是数据到达套接字(因为 recv() 将阻塞)) .

在传统的 Win32 主循环中,您可能会在每次线程调用 GetMessage() 时阻塞。所有的事件驱动的窗口系统都是类似的。

【讨论】:

    【解决方案3】:

    我很确定您说的是busy wait,您在每次迭代时都有一个循环轮询某些条件。

    【讨论】:

      猜你喜欢
      • 2021-12-20
      • 1970-01-01
      • 2016-09-01
      • 1970-01-01
      • 2011-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多