Альтернативным вариантом синхронизации является использование событий. Объект событие может быть либо свободным (signaled) или установленным (set), либо занятым (non-signaled) или сброшенным (reset). Вы можете создать объект "событие" с помощью функции:
hEvent = CreateEvent(&sa, fManual, fInitial, pszName);
Первый параметр - указатель на структуру SECURITY_ATTRIBUTES, устанавливающую параметры использования события потоками и процессами.
Параметр fInitial устанавливается в TRUE, если вы хотите, чтобы объект Событие был изначально свободным, или в FALSE, чтобы он был занятым.
Параметр pszName определяет имя события. По этому имени разные процессы могут использовать одно событие.
Для того, чтобы сделать свободным существующий объект Событие, надо вызвать функцию:
SetEvent(hEvent);
Чтобы сделать объект Событие занятым, вызывается функция:
ResetEvent(hEvent);
Для синхронизации используется функция:
WaitForSingleObject(hEvent, dwTimeOut);
где второй параметр имеет значение INFINITE. Возврат из функции происходит немедленно, если объект событие в настоящее время свободен. В противном случае поток будет приостановлен в функции до тех пор, пока событие не станет свободным. Вы можете установить значение тайм-аута во втором параметре, задав его величину в миллисекундах. Тогда возврат из функции произойдет, когда объект Событие станет свободным или истечет тайм-аут.
Если параметр fManual имеет значение FALSE при вызове функции CreateEvent, то объект Событие автоматически становится занятым, когда осуществляется возврат из функции WaitForSingleObject. Эта особенность позволяет избежать использования функции ResetEvent.