据我所知,事件驱动程序需要一个主循环,例如
while (1) {
}
我只是好奇这个while循环是否会花费高CPU使用率?有没有其他方法可以在不使用主循环的情况下实现事件驱动程序?
答案 0 :(得分:3)
你的例子有误导性。通常,事件循环看起来像这样:
Event e;
while ((e = get_next_event()) != E_QUIT)
{
handle(e);
}
关键的一点是函数调用我们的虚拟get_next_event()
抽取函数将是慷慨的,并鼓励上下文切换或任何调度语义适用于您的平台,如果没有事件,该函数可能会允许整个过程一直睡到事件到来之前。
所以在实践中没有什么可担心的,不,如果你想在程序运行期间处理无限量的信息,那么对于无界循环没有任何替代方法。
答案 1 :(得分:1)
通常,像这样的循环的问题在于,当它正在做一件工作时,它不能做任何其他事情(例如Windows SDK的旧'合作'多任务处理)。下一个天真的跳跃通常是为每件作品产生一个线程,但那是非常危险的。大多数人最终会得到一个通常在其中有一个线程池的执行器。然后,句柄调用实际上只是将工作排入队列,下一个可用线程将其取消并执行它。并发线程数保持固定为池中工作线程的总数,当线程没有任何操作时,它们不会占用CPU。