事件驱动编程和替代方案的主循环

时间:2012-05-06 00:27:47

标签: cpu-usage event-driven

据我所知,事件驱动程序需要一个主循环,例如

while (1) {

} 

我只是好奇这个while循环是否会花费高CPU使用率?有没有其他方法可以在不使用主循环的情况下实现事件驱动程序?

2 个答案:

答案 0 :(得分:3)

你的例子有误导性。通常,事件循环看起来像这样:

Event e;
while ((e = get_next_event()) != E_QUIT)
{
    handle(e);
}

关键的一点是函数调用我们的虚拟get_next_event()抽取函数将是慷慨的,并鼓励上下文切换或任何调度语义适用于您的平台,如果没有事件,该函数可能会允许整个过程一直睡到事件到来之前。

所以在实践中没有什么可担心的,不,如果你想在程序运行期间处理无限量的信息,那么对于无界循环没有任何替代方法。

答案 1 :(得分:1)

通常,像这样的循环的问题在于,当它正在做一件工作时,它不能做任何其他事情(例如Windows SDK的旧'合作'多任务处理)。下一个天真的跳跃通常是为每件作品产生一个线程,但那是非常危险的。大多数人最终会得到一个通常在其中有一个线程池的执行器。然后,句柄调用实际上只是将工作排入队列,下一个可用线程将其取消并执行它。并发线程数保持固定为池中工作线程的总数,当线程没有任何操作时,它们不会占用CPU。