Подтвердить что ты не робот

Разница между объектом события и переменной условия

В чем разница между объектами событий и переменными условия? Я спрашиваю в контексте WIN32 API.

4b9b3361

Ответ 1

Объекты событий - это объекты уровня ядра. Они могут быть разделены между границами процесса и поддерживаются на всех версиях ОС Windows. При желании они могут использоваться как собственные автономные блокировки для общих ресурсов. Поскольку они являются объектами ядра, ОС имеет ограничения на количество доступных событий, которые могут быть выделены за раз.

Условие Переменные - это объекты уровня пользователя. Они не могут быть разделены между границами процесса и поддерживаются только в Vista/2008 и более поздних версиях. Они не действуют как свои собственные блокировки, но требуют от них отдельный замок, например критический раздел. Поскольку они являются объектами пользователя, количество доступных переменных ограничено доступной памятью. Когда условная переменная укладывается в спящий режим, она автоматически освобождает указанный объект блокировки, чтобы другой поток мог его получить. Когда Условная переменная просыпается, она автоматически повторно получает указанный объект блокировки.

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

Ответ 2

Они очень похожи, но объекты событий работают через границы процесса, а переменные условия - нет. Из документация MSDN по переменным состояния:

Переменные условия являются пользовательскими объекты, которые нельзя процессы.

Из Документация MSDN для объектов событий:

Темы других процессов могут открывать обращаться к существующему объекту события посредством указав его имя в вызове Функция OpenEvent.

Ответ 3

Самое существенное различие заключается в том, что объект Event является объектом ядра и может быть разделен между процессами, пока он жив, когда процессы/потоки пытаются получить, напротив, переменная условия - это объект пользовательского режима, который является светлым (имеет только тот же размер, что и указатель, и не имеет ничего дополнительного после его использования) и имеет лучшую производительность.

Обычно переменная условия часто используется вместе с блокировками, так как нам нужно правильно синхронизировать данные. При рассмотрении переменной условий мы рассматриваем ее как ключевые события, которые были улучшены с Vista.

У Джо Даффи есть сообщение в блоге http://joeduffyblog.com/2006/11/28/windows-keyed-events-critical-sections-and-new-vista-synchronization-features/, в котором объясняется более подробная информация.