이벤트 개체와 조건 변수의 차이점은 무엇입니까? WIN32 API의 컨텍스트에서 묻습니다.이벤트 개체와 조건 변수의 차이점
답변
이벤트 개체는 커널 수준 개체입니다. 프로세스 경계를 넘어서 공유 할 수 있으며 모든 Windows OS 버전에서 지원됩니다. 원하는 경우 공유 리소스에 대한 자체 독립 실행 형 잠금으로 사용할 수 있습니다. 커널 객체이기 때문에 OS는 한 번에 할당 할 수있는 사용 가능한 이벤트 수에 제한이 있습니다.
조건 변수는 사용자 수준 개체입니다. 프로세스 경계를 넘어서 공유 할 수 없으며 Vista/2008 및 이후 버전에서만 지원됩니다. 이들은 자체 잠금으로 작동하지 않지만 중요한 섹션과 같이 별도의 잠금이 필요합니다. 사용자 객체이므로 사용 가능한 변수의 수는 사용 가능한 메모리에 의해 제한됩니다. 조건부 변수는 절전 모드로 전환 될 때 지정된 잠금 개체를 자동으로 해제하여 다른 스레드가이를 획득 할 수있게합니다. 조건부 변수가 깨어 나면 지정된 잠금 객체를 자동으로 다시 가져옵니다.
기능면에서 조건부 변수는 함께 작동하는 두 개체, 즉 keyed event과 잠금 개체의 논리적 조합으로 생각하십시오. 조건 변수는 절전 모드로 전환 될 때 이벤트를 다시 설정하고 잠금을 해제하고 신호가 수신 될 때까지 대기 한 다음 잠금을 다시 획득합니다. 예를 들어, 중요한 섹션을 잠금 개체로 사용하는 경우 SleepConditionalVariableCS()
은 ResetEvent()
, LeaveCriticalSection()
, WaitForSingleObject()
및 EnterCriticalSection()
의 호출 순서와 유사합니다. SRWL을 잠금으로 사용하는 경우 SleepConditionVariableSRW()
은 ResetEvent()
, ReleaseSRWLock...()
, WaitForSingleObject()
및 AcquireSRWLock...()
에 대한 호출 순서와 유사합니다.
매우 유사하지만 이벤트 객체는 프로세스 경계에서 작동하지만 조건 변수는 그렇지 않습니다. MSDN documentation on condition variables에서 :
조건 변수는 프로세스간에 공유 할 수 없습니다 객체는 사용자 모드입니다. MSDN documentation on event objects에서
는 : 다른 프로세스에서
스레드는 OpenEvent가 함수 호출에 이름을 지정 하여 기존 이벤트 객체에 핸들을 열 수 있습니다.
아니요, 레미 르보는 진실에 가깝습니다. 조건 변수는 최근 Unix에서 Windows로 가져온 것입니다. 이벤트 객체는 조건의 창백한 모방입니다.사실 Event Object와 Mutex 만 주어진 조건 변수를 구현하는 것은 중요하지 않습니다. http://www.cse.wustl.edu/~schmidt/win32-cv-1.html을 참조하십시오. – Arkadiy
가장 중요한 차이점은 Event 객체는 커널 객체이며 프로세스/스레드가 획득하려고 시도 할 때 프로세스간에 공유 될 수 있다는 것입니다. 반면 조건 변수는 사용자 모드 객체입니다. 라이트 (포인터와 크기가 같고 사용 후 해제 될 추가 요소가 없음) 성능이 뛰어납니다.
일반적으로 데이터를 올바르게 동기화해야하므로 일반적으로 조건 변수가 잠금과 함께 사용됩니다. Condition Variable을 고려할 때 Vista 이후 개선 된 키 이벤트와 같이 처리합니다.
Joe duffy는 블로그 게시물 http://joeduffyblog.com/2006/11/28/windows-keyed-events-critical-sections-and-new-vista-synchronization-features/에 자세한 정보를 설명했습니다.
- 1. 개체와 정적 메서드의 차이점
- 2. 두 변수의 차이점
- 3. 속성과 변수의 차이점
- 4. 가변 개체와 변경 불가능 개체의 차이점
- 5. 자바 일반 매개 변수의 차이점
- 6. 시스템 속성과 환경 변수의 차이점
- 7. 동적 이벤트 조건
- 8. Windows에서 커널 개체와 이벤트 개체의 차이점은 무엇입니까?
- 9. args 변수의 최대 및 최대 차이점
- 10. bash의 비 설정 변수와 빈 변수의 차이점
- 11. 루비의 로컬 변수와 인스턴스 변수의 차이점
- 12. SQL 2005에서 임시 테이블과 테이블 변수의 차이점
- 13. Windows 조건 변수 대 이벤트
- 14. Load 이벤트, Activate 이벤트 및 Form에 이벤트 입력 간의 차이점
- 15. Google지도 : 이벤트 리스너는 변수의 최종 값만 기억합니다.
- 16. 로컬 변수의 익명 이벤트 처리기를 구독 취소해야합니까?
- 17. 이벤트 핸들러에서 체크 상자의 조건 확인
- 18. 정적 이벤트 처리기와 비 정적 이벤트 처리기의 차이점
- 19. C# 및 VB.NET 간의 이벤트 처리 차이점
- 20. 포커스와 포커스 인 (아웃) - 이벤트 신호의 차이점
- 21. EventTrigger의 조건
- 22. 비즈니스 개체와 엔터티
- 23. 클래스 개체와 클래스의 인스턴스
- 24. 정렬 개체와 다형성
- 25. jQuery를 개체와 form.serialize
- 26. Facebook은 "세션"개체와 연결합니다.
- 27. Stream 변수의 지속성 문제
- 28. 레일 - named_scopes - 조건 조건
- 29. ASP.NET 4 : 개체와 문자열의 결과 집합을 비교하십시오.
- 30. 조건
CS에 이벤트가 들어있는 경우 CS를 얻지 못하면 어떻게 사용 가능한 메모리로 제한되는지 주장 할 수 있습니다 시스템에서 사용 가능한 이벤트 수 대신에? – Mehrdad
나는 CS에 * ACTUAL * 이벤트 객체가 포함되어 있다고 말하지 않았다. 내가 말한 것은 "기술적으로는 조건 변수가 실제로 내부적으로 수행하는 것이 아니다"이다. ACTS는 이벤트를 사용하는 것과 같지만 실제로는 그렇지 않다. . CS가 대기하는 방법에 대한 세부 사항은 OS 구현에 비공식적입니다. 예를 들어,'SleepConditionVariableCS()'의 경우,'SleepEx()'를 대신 사용하고,'WakeConditionVariable()'의 APC 나 타임 아웃에 의해 깨어납니다. 나는 그것을 반영하기 위해 대답으로 업데이트했다. –
walkbear의 대답을 읽은 후 구현은 [keyed event]를 사용하는 것 같습니다 (http://joeduffyblog.com/2006/11/28/windows-keyed-events-critical-sections-and-new-vista-synchronization-features). /)를 대기 가능한 객체로 사용합니다. 이렇게하면 여러 CS가 항상 사용할 수 있고 개별 스레드가 개별적으로 대기 할 수있는 단일 커널 이벤트 객체를 공유하는 방식을 사용합니다. –