Разница между объектом события и условной переменной - PullRequest
12 голосов
/ 01 августа 2009

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

Ответы [ 3 ]

22 голосов
/ 01 августа 2009

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

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

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

2 голосов
/ 01 августа 2009

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

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

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

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

1 голос
/ 28 марта 2014

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...