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