Одно событие может уведомить несколько потоков, если это событие с ручным сбросом. Событие с автосбросом не может этого сделать. Если более одного протектора ожидает одновременно событие автоматического сброса, и вы установили его в сигнальное состояние, существует только один поток и сбрасывает его, а поведение других потоков будет неопределенным. Хотя из документации Microsoft мы можем предположить, что один и только один поток выйдет, а другие точно не выйдут. В любом случае, мы должны принять во внимание следующую цитату: «Не принимайте заказ« первым пришел - первым вышел »(FIFO). Внешние события, такие как APC в режиме ядра, могут изменить порядок ожидания »Источник - https://msdn.microsoft.com/en-us/library/windows/desktop/ms682655(v=vs.85).aspx
Функция CreateEvent имеет параметр bManualReset. Если это ИСТИНА, функция создает объект события с ручным сбросом, который требует использования функции ResetEvent, чтобы установить состояние события как не сигнализированное. Если этот параметр имеет значение FALSE, функция создает объект события с автоматическим сбросом, и система автоматически сбрасывает состояние события как не сигнализированное после того, как был освобожден единственный ожидающий поток, то есть вышел из функции, такой как WaitForMultipleObjects или WaitForSigleObject, но, как Я писал ранее, только один поток будет уведомлен не все.
Что касается PulseEvent - он ненадежен и никогда не должен использоваться - см. https://msdn.microsoft.com/en-us/library/windows/desktop/ms684914(v=vs.85).aspx
PulseEvent уведомляет только те потоки, которые находятся в состоянии «ожидания» в момент вызова PulseEvent. Если они находятся в каком-либо другом состоянии, они не будут уведомлены, и вы никогда не узнаете наверняка, в каком состоянии находится поток. Поток, ожидающий объекта синхронизации, может быть на мгновение удален из состояния ожидания с помощью асинхронного вызова процедуры в режиме ядра, а затем возвращен в состояние ожидания после завершения APC. Если вызов PulseEvent происходит в то время, когда поток был удален из состояния ожидания, поток не будет освобожден, поскольку PulseEvent освобождает только те потоки, которые ожидают в момент его вызова. Вы можете узнать больше об асинхронных вызовах процедур в режиме ядра (APC) по следующим ссылкам:
Дополнительные сведения о событиях автоматического сброса и событиях ручного сброса можно найти в следующей статье: