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