Win32 API поддерживает целый ряд функций, которые начинаются с Wait. Это ожидающие функции. Смысл их в том, что они блокируют выполнение потока до наступления какого-то события или тайм-аута.
WaitForMultipleObjects WaitForMultipleObjectsEx WaitForSingleObject WaitForSingleObjectEx MsgWaitForMultipleObjects MsgWaitForMultipleObjectsEx
Немного в стороне функция WaitCommEvent() предназначенная для работы с данными в последовательных портах.
Для того, чтобы пользоваться этими функциями должен быть объект синхронизации, который эти функции и проверяют. У этих объектов два состояния: установлен и сброшен. При вызове этих функций им передается указатель на объект синхронизации. Объект проверяется. Если он не установлен, то функция будет ждать пока не истечет тайм-аут. Все это время поток будет блокирован. Эти функции можно представить шаблонно так:
DWORD Wait........ ( HANDLE hHandle, // указатель на объект синхронизации DWORD dwMilliseconds // тайм аут );
Функции где в имени есть Single предназначены для установки одного синхронизирующего объекта, а где есть Multiple можно установить ожидание сразу нескольким объектам. Функции с префиксами Msg предназначены для ожидания события определенного типа, например, ввода с клавиатуры. Функции с окончанием Ex расширены опциями по управлению асинхронным вводом-выводом.
Использование ожижающих функций и вообще сихронизации опасны появлением ситуации названной deadlock или тупиковой ситуацией, когда один поток ожидает освобождения ресурса от другого потока.