【问题标题】:How does C++ allow to wait without excessive CPU usageC ++如何允许等待而没有过多的CPU使用
【发布时间】:2019-06-15 17:57:17
【问题描述】:

例如我有代码

while (!something} {
    //waiting
}

它确实在等待某事,但它会占用大量 CPU。 C++ 有诸如线程连接、条件变量等待、互斥锁之类的东西——它允许等待,所以它确实检查了一些条件,但它的行为就像空闲进程——不消耗 CPU 时间。它是如何完成的,有没有办法让 while 循环(或任何其他代码)表现得像这样?

【问题讨论】:

  • 通常,在操作系统的帮助下(可能还有一些特定于 CPU 的指令,以减少自旋/等待循环期间的使用)。
  • 如果你想等待“某事”成为现实,通常最好有一个由事件或消息调用的函数,或者像你提到的那样等待。使用消息/事件处理程序还意味着,例如 UI 线程保持运行,因此您的程序不会冻结。
  • 您要么等待指定的时间(std::this_thread::sleep_for),要么等待特定条件(std:: condition_variable 和朋友)。所以已经有方法可以做,你想要什么。
  • @radosław-cybulski 是的,有可用的工具,但我想了解一下它们的工作方式
  • 您提到的所有机制都会为操作系统生成系统调用,以使该线程脱离上下文。一旦脱离上下文,它就会保留在那里(当然不花费任何 CPU 时间),直到它被另一个线程发出信号,即,一个线程(又一个)对操作系统进行系统调用以将前一个线程放回上下文.因此,尽管 C++ STL 支持所有这些(甚至可能由语言标准本身),但这些机制的实现是依赖于操作系统的。

标签: c++ wait


【解决方案1】:

这些是操作系统必须支持的功能。

操作系统负责为您的进程和线程分配时间,您需要这些功能来控制(或者更确切地说,发出请求)该机制。

您的 C++ 标准库实现调用操作系统提供的特定于平台的函数。

如果不使用您已经列出的那种 C++ 类型/函数:互斥体和计时器(或者不自己调用这些操作系统函数,就像我们在过去所做的那样!),就无法自己复制它。你所能做的就是一个自旋锁,就像你已经演示过的那样。

【讨论】:

    【解决方案2】:

    您可以通过调用阻止线程执行的系统调用来实现这一点。

    您通常不直接调用系统,而是使用包装函数,这是对系统特定细节的抽象。这种方法使您的程序可以移植到不同的系统。

    事实上,这正是std::condition_variable::wait 等标准函数的含义:对系统接口的抽象,在这种情况下阻塞线程。 std::cin::operator>> 是另一个阻塞线程执行的函数调用示例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-11
      • 2011-12-08
      • 2011-04-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多