2009-07-31 3 views

ответ

21

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

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

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

+0

Я не понимаю, если CS содержит событие внутри него, то как вы можете утверждать, что он ограничен доступной памятью а не количеством доступных событий в системе? – Mehrdad

+0

Я не сказал, что CS содержит объект события * ACTUAL *, что я сказал «технически, это не то, что условная переменная действительно делает внутренне», IOW это только ACTS, как будто оно использует событие, но, скорее всего, это не , Информация о том, как CS ждет, является частной для реализации ОС. Например, в случае 'SleepConditionVariableCS()' он скорее использует 'SleepEx()' вместо этого, а затем просыпается тайм-аутом или APC из 'WakeConditionVariable()'. Я обновил ответ, чтобы это отразить. –

+0

После того, как вы ответите на вопрос о гусеничном ходу, реализация, скорее всего, будет использована [ключевое событие] (http://joeduffyblog.com/2006/11/28/windows-keyed-events-critical-sections-and-new-vista-synchronization-features /) как ожидаемый объект. Таким образом, несколько CS используют общий доступ к одному объекту события ядра, который всегда доступен, и его можно ожидать отдельными потоками по отдельности. –

2

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

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

От MSDN documentation on event objects:

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

+6

Нет, Реми Лебо ближе к истине. Условие Variable - это то, что недавно было импортировано из Unix в Windows. Объект события - это бледное подражание Условию.На самом деле, нетривиально реализовать условие Var, заданное только для объекта события и Mutex. См. Http://www.cse.wustl.edu/~schmidt/win32-cv-1.html – Arkadiy

1

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

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

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

Смежные вопросы