2

无限循环被教导为邪恶。有什么好用的吗?

意外编码时,CPU 会达到峰值,我想内存也会达到峰值,尤其是在循环内分配变量时。

如果有好的用途,如何预防这些问题?

4

3 回答 3

6

基本上每个操作系统或服务器都在无限循环中旋转。

为了避免这些内存问题,您通常不会在循环内分配内存,除非它可以稍后在同一个循环内释放。例如,您将为请求分配内存并在服务完成后将其删除。

为了避免 cpu 峰值,您将在操作系统的情况下等待中断,或者调用像 poll() 这样的阻塞函数,该函数在每次迭代时等待一个新事件。

于 2013-08-19T12:09:24.717 回答
4

首先,这个短语中的“无限”这个词应该更宽松一点。我假设您正在谈论一个while (true)带有break指令的循环,该指令最终结束,而不是一个将运行到时间和全人类结束的循环。

从前一种意义上说,是的,有些例是合适的:

可能不恰当地使用它们的一个例子是当它们被用来通过旋转 CPU 来创建时间延迟时,这是新手程序员倾向于避免处理定时器中断(或定时器事件或其他非程序结构)的做法。但是,当旋转 CPU 以获取共享资源时,“无限循环”也是一个完全有效的实现选择。例如,即使是 .NET CLR 监视器也会尝试旋转数百个周期,然后才会对内核事件句柄发出真正的等待并创建更昂贵的线程切换。

于 2013-08-19T14:25:30.497 回答
2

除了在事件循环上运行的程序(如@Christoph 提到的系统进程)之外,一些语言还有一个称为生成器的概念,它允许甚至鼓励您编写无限循环。诀窍是该对象仅在“产生”(返回)某个表达式时才运行有限的时间。之后,它的状态被“冻结”,直到再次需要它。例如,在 Python 中,您可以拥有一个在LEFT和之间交替的对象RIGHT

def side():
    while True:
        yield "LEFT"
        yield "RIGHT"

a = side()
print a.next()
print a.next()
print a.next()

哪个会给LEFT RIGHT LEFT。该side函数看起来像一个带有语句的无限循环While True:,但每次调用它只会运行有限的时间。

于 2013-08-19T13:41:21.747 回答