私の知る限り、イベント駆動型プログラムには、次のようなメインループが必要です。
while (1) {
}
このwhileループが高いCPU使用率を犠牲にする可能性があるかどうか、私はただ興味がありますか?メインループを使用せずにイベント駆動型プログラムを実装する他の方法はありますか?
私の知る限り、イベント駆動型プログラムには、次のようなメインループが必要です。
while (1) {
}
このwhileループが高いCPU使用率を犠牲にする可能性があるかどうか、私はただ興味がありますか?メインループを使用せずにイベント駆動型プログラムを実装する他の方法はありますか?
あなたの例は誤解を招くものです。通常、イベントループは次のようになります。
Event e;
while ((e = get_next_event()) != E_QUIT)
{
handle(e);
}
重要な点は、架空のget_next_event()
ポンピング関数への関数呼び出しが寛大であり、コンテキストスイッチまたはプラットフォームに適用されるスケジューリングセマンティクスを促進することです。イベントがない場合、関数はおそらくイベントまでプロセス全体をスリープさせるでしょう。到着。
したがって、実際には心配することは何もありません。プログラムの実行中に無制限の量の情報を処理する場合は、無制限のループに代わるものは実際にはありません。
通常、このようなループの問題は、1つの作業を実行している間は、他の作業を実行できないことです(たとえば、Windows SDKの古い「協調的」マルチタスク)。これからの次の素朴なジャンプは、通常、各作業にスレッドを生成することですが、それは非常に危険です。ほとんどの人は、一般的に内部にスレッドプールを持っているエグゼキュータになってしまいます。次に、handle呼び出しは実際には作業をエンキューしているだけであり、次に使用可能なスレッドが作業をデキューして実行します。同時スレッドの数は、プール内のワーカースレッドの総数として固定されたままであり、スレッドが何もする必要がない場合、CPUを消費していません。