Лучше всего описать мой вопрос в примере:
- Мы создаем дескриптор события Windows с помощью CreateEvent, с manualReset как FALSE.
- Мы создаем 4 потока.Убедитесь, что все они запускаются и ожидают указанное выше событие с помощью WaitForSingleObject.
В основном потоке, в цикле for, мы сигнализируем это событие 4 раза с помощью SetEvent.такие как:
for (int i = 0; i <4; ++ i) :: SetEvent (событие); </p>
Мой вопрос, можем ли мы сказатьчто все эти 4 потока наверняка будут разбужены от ожидания этого события?
Согласно моему пониманию Windows Event, ответ - ДА.Потому что, когда событие установлено, всегда есть поток, ожидающий его.
Однако я прочитал на MSDN, что " Установка события, которое уже установлено, не имеет никакого эффекта ".Поскольку ожидающие потоки, вероятно, не получат шанса на запуск во время события установки основного потока в цикле.Могут ли они все еще получать уведомления и сбрасывать событие в состояние без сигнала?Если событие не сбрасывается, следующее SetEvent в цикле явно бесполезно.
Или ядро ОС знает, какой поток должен быть уведомлен, когда событие установлено, и немедленно сбрасывает это событие, если есть ожидающий поток,Таким образом, ожидающему потоку не нужно планировать сброс события в состояние без сигнала?
Любые пояснения или ссылки приветствуются.Спасибо.