Существует четыре основных подхода:
- Использовать какой-нибудь ожидающий примитив ОС для ожидания события
- Используйте некоторый примитив таймера ОС, чтобы проверить с определенной частотой, произошло ли событие еще
- Повторно проверяйте, произошло ли событие, но используйте примитив ОС, чтобы получить временной интервал на произвольную и неизвестную продолжительность в любое время, когда это не произошло.
- Повторно проверяйте, произошло ли событие, не возвращая ЦП, если это не произошло.
Когда № 1 практичен, зачастую это лучший подход, если только задержка ответа на событие не может быть полезной. Например, если ожидается получение большого количества данных последовательного порта в течение нескольких секунд, и если обработка данных через 100 мс после их отправки будет столь же хороша, как и их мгновенная обработка, периодический опрос с использованием одного из двух последних подходы могут быть лучше, чем установка события «данные получены».
Подход № 3 довольно груб, но во многих случаях может быть хорошим. Зачастую это будет тратить больше процессорного времени и ресурсов, чем на первый шаг, но во многих случаях его будет проще реализовать, а расход ресурсов во многих случаях будет достаточно мал, чтобы не иметь значения.
Подход №2 часто более сложен, чем №3, но имеет преимущество в том, что может обрабатывать множество ресурсов с помощью одного таймера и без выделенного потока.
Подход № 4 иногда необходим во встроенных системах, но, как правило, он очень плохой, если только не выполняется непосредственный опрос аппаратного обеспечения, и у него не будет ничего полезного, пока не произойдет рассматриваемое событие. Во многих случаях не может произойти ожидаемое условие, пока поток, ожидающий его, не выдаст ЦП. Выход из CPU, как в подходе № 3, фактически позволит ожидающему потоку увидеть событие раньше, чем его включит.