Ответ 1
Объекты событий - это объекты уровня ядра. Они могут быть разделены между границами процесса и поддерживаются на всех версиях ОС Windows. При желании они могут использоваться как собственные автономные блокировки для общих ресурсов. Поскольку они являются объектами ядра, ОС имеет ограничения на количество доступных событий, которые могут быть выделены за раз.
Условие Переменные - это объекты уровня пользователя. Они не могут быть разделены между границами процесса и поддерживаются только в Vista/2008 и более поздних версиях. Они не действуют как свои собственные блокировки, но требуют от них отдельный замок, например критический раздел. Поскольку они являются объектами пользователя, количество доступных переменных ограничено доступной памятью. Когда условная переменная укладывается в спящий режим, она автоматически освобождает указанный объект блокировки, чтобы другой поток мог его получить. Когда Условная переменная просыпается, она автоматически повторно получает указанный объект блокировки.
В терминах функциональности подумайте о условной переменной как о логической комбинации двух объектов, работающих вместе - ключевое событие и объект блокировки, Когда переменная состояния переводится в спящий режим, она сбрасывает событие, освобождает блокировку, ожидает, когда событие будет сигнализировано, а затем повторно закроет блокировку. Например, если вы используете критический раздел как объект блокировки, SleepConditionalVariableCS()
похож на последовательность вызовов ResetEvent()
, LeaveCriticalSection()
, WaitForSingleObject()
и EnterCriticalSection()
. Если в качестве блокировки используется SRWL, SleepConditionVariableSRW()
похож на последовательность вызовов ResetEvent()
, ReleaseSRWLock...()
, WaitForSingleObject()
и AcquireSRWLock...()
.