【发布时间】: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 支持所有这些(甚至可能由语言标准本身),但这些机制的实现是依赖于操作系统的。