2009-07-31 4 views

답변

21

이벤트 개체는 커널 수준 개체입니다. 프로세스 경계를 ​​넘어서 공유 할 수 있으며 모든 Windows OS 버전에서 지원됩니다. 원하는 경우 공유 리소스에 대한 자체 독립 실행 형 잠금으로 사용할 수 있습니다. 커널 객체이기 때문에 OS는 한 번에 할당 할 수있는 사용 가능한 이벤트 수에 제한이 있습니다.

조건 변수는 사용자 수준 개체입니다. 프로세스 경계를 ​​넘어서 공유 할 수 없으며 Vista/2008 및 이후 버전에서만 지원됩니다. 이들은 자체 잠금으로 작동하지 않지만 중요한 섹션과 같이 별도의 잠금이 필요합니다. 사용자 객체이므로 사용 가능한 변수의 수는 사용 가능한 메모리에 의해 제한됩니다. 조건부 변수는 절전 모드로 전환 될 때 지정된 잠금 개체를 자동으로 해제하여 다른 스레드가이를 획득 할 수있게합니다. 조건부 변수가 깨어 나면 지정된 잠금 객체를 자동으로 다시 가져옵니다.

기능면에서 조건부 변수는 함께 작동하는 두 개체, 즉 keyed event과 잠금 개체의 논리적 조합으로 생각하십시오. 조건 변수는 절전 모드로 전환 될 때 이벤트를 다시 설정하고 잠금을 해제하고 신호가 수신 될 때까지 대기 한 다음 잠금을 다시 획득합니다. 예를 들어, 중요한 섹션을 잠금 개체로 사용하는 경우 SleepConditionalVariableCS()ResetEvent(), LeaveCriticalSection(), WaitForSingleObject()EnterCriticalSection()의 호출 순서와 유사합니다. SRWL을 잠금으로 사용하는 경우 SleepConditionVariableSRW()ResetEvent(), ReleaseSRWLock...(), WaitForSingleObject()AcquireSRWLock...()에 대한 호출 순서와 유사합니다.

+0

CS에 이벤트가 들어있는 경우 CS를 얻지 못하면 어떻게 사용 가능한 메모리로 제한되는지 주장 할 수 있습니다 시스템에서 사용 가능한 이벤트 수 대신에? – Mehrdad

+0

나는 CS에 * ACTUAL * 이벤트 객체가 포함되어 있다고 말하지 않았다. 내가 말한 것은 "기술적으로는 조건 변수가 실제로 내부적으로 수행하는 것이 아니다"이다. ACTS는 이벤트를 사용하는 것과 같지만 실제로는 그렇지 않다. . CS가 대기하는 방법에 대한 세부 사항은 OS 구현에 비공식적입니다. 예를 들어,'SleepConditionVariableCS()'의 경우,'SleepEx()'를 대신 사용하고,'WakeConditionVariable()'의 APC 나 타임 아웃에 의해 깨어납니다. 나는 그것을 반영하기 위해 대답으로 업데이트했다. –

+0

walkbear의 대답을 읽은 후 구현은 [keyed event]를 사용하는 것 같습니다 (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

아니요, 레미 르보는 진실에 가깝습니다. 조건 변수는 최근 Unix에서 Windows로 가져온 것입니다. 이벤트 객체는 조건의 창백한 모방입니다.사실 Event Object와 Mutex 만 주어진 조건 변수를 구현하는 것은 중요하지 않습니다. http://www.cse.wustl.edu/~schmidt/win32-cv-1.html을 참조하십시오. – Arkadiy

1

가장 중요한 차이점은 Event 객체는 커널 객체이며 프로세스/스레드가 획득하려고 시도 할 때 프로세스간에 공유 될 수 있다는 것입니다. 반면 조건 변수는 사용자 모드 객체입니다. 라이트 (포인터와 크기가 같고 사용 후 해제 될 추가 요소가 없음) 성능이 뛰어납니다.

일반적으로 데이터를 올바르게 동기화해야하므로 일반적으로 조건 변수가 잠금과 함께 사용됩니다. Condition Variable을 고려할 때 Vista 이후 개선 된 키 이벤트와 같이 처리합니다.

Joe duffy는 블로그 게시물 http://joeduffyblog.com/2006/11/28/windows-keyed-events-critical-sections-and-new-vista-synchronization-features/에 자세한 정보를 설명했습니다.

관련 문제