次の 4 つの基本的なアプローチがあります。
- OS 待機プリミティブを使用して、イベントが発生するまで待機します。
- OSタイマープリミティブを使用して、イベントがまだ発生しているかどうかを定義された速度で確認します
- イベントが発生したかどうかを繰り返し確認しますが、OS プリミティブを使用して、発生していない任意の不明な期間のタイム スライスを生成します。
- イベントが発生したかどうかを繰り返し確認し、発生していない場合は CPU を解放しません。
#1 が実用的である場合、イベントへの対応を遅らせることが有益でない限り、多くの場合、これが最善のアプローチです。たとえば、数秒間にわたって大量のシリアル ポート データを受信することが予想され、データが送信されてから 100 ミリ秒後にデータを処理することが、即座に処理するのと同じくらい良い場合は、後者の 2 つのいずれかを使用して定期的にポーリングします。アプローチは、「データ受信」イベントを設定するよりも優れている場合があります。
アプローチ 3 はかなり大雑把ですが、多くの場合は適切な方法です。多くの場合、#1 にアプローチするよりも多くの CPU 時間とリソースを浪費しますが、多くの場合、実装がより簡単になり、多くの場合、リソースの浪費は問題にならないほど小さくなります。
アプローチ 2 は 3 よりも複雑になることがよくありますが、多くのリソースを 1 つのタイマーで専用スレッドなしで処理できるという利点があります。
アプローチ #4 は、組み込みシステムで必要になる場合がありますが、ハードウェアを直接ポーリングしていない限り、通常は非常に悪い方法であり、問題のイベントが発生するまで何もする必要はありません。多くの場合、待機中のスレッドが CPU を解放するまで、待機中の状態が発生することはありません。アプローチ #3 のように CPU を明け渡すと、待機中のスレッドはイベントを独占するよりも早くイベントを確認できるようになります。