조건 변수
조건 변수는 스레드가 특정 조건이 발생할 때까지 기다릴 수 있도록 하는 동기화 기본 형식입니다. 조건 변수는 프로세스 간에 공유할 수 없는 사용자 모드 개체입니다.
조건 변수를 사용하면 스레드가 잠금을 원자적으로 해제하고 절전 모드 상태로 전환할 수 있습니다. 중요한 섹션 또는 SRW(슬림 판독기/기록기) 잠금과 함께 사용할 수 있습니다. 조건 변수는 대기 스레드를 "절전 모드 해제" 또는 "모두 절전 모드 해제" 작업을 지원합니다. 스레드가 절전 모드 해제된 후 스레드가 절전 상태에 들어갔을 때 해제된 잠금을 다시 획득합니다.
호출자는 CONDITION_VARIABLE 구조를 할당하고 InitializeConditionVariable 을 호출하여 초기화하거나(구조체를 동적으로 초기화하기 위해) 구조 변수에 상수 CONDITION_VARIABLE_INIT 할당해야 합니다(정적으로 구조를 초기화하려면).
Windows Server 2003 및 Windows XP: 조건 변수는 지원되지 않습니다.
다음은 조건 변수 함수입니다.
조건 변수 함수 | 설명 |
---|---|
InitializeConditionVariable | 조건 변수를 초기화합니다. |
SleepConditionVariableCS | 지정된 조건 변수에서 절전 모드로 전환하고 지정된 위험 섹션을 원자성 작업으로 해제합니다. |
SleepConditionVariableSRW | 지정된 조건 변수에서 절전 모드로 전환하고 지정된 SRW 잠금을 원자성 작업으로 해제합니다. |
WakeAllConditionVariable | 지정된 조건 변수에서 대기 중인 모든 스레드를 해제합니다. |
WakeConditionVariable | 지정된 조건 변수에서 대기 중인 단일 스레드를 해제합니다. |
다음 의사 코드는 조건 변수의 일반적인 사용 패턴을 보여 줍니다.
CRITICAL_SECTION CritSection;
CONDITION_VARIABLE ConditionVar;
void PerformOperationOnSharedData()
{
EnterCriticalSection(&CritSection);
// Wait until the predicate is TRUE
while( TestPredicate() == FALSE )
{
SleepConditionVariableCS(&ConditionVar, &CritSection, INFINITE);
}
// The data can be changed safely because we own the critical
// section and the predicate is TRUE
ChangeSharedData();
LeaveCriticalSection(&CritSection);
// If necessary, signal the condition variable by calling
// WakeConditionVariable or WakeAllConditionVariable so other
// threads can wake
}
예를 들어 판독기/기록기 잠금 TestPredicate
구현에서 함수는 현재 잠금 요청이 기존 소유자와 호환되는지 확인합니다. 이 경우 잠금을 획득합니다. 그렇지 않으면 절전 모드입니다. 자세한 예제는 조건 변수 사용을 참조하세요.
조건 변수는 가짜 절전 모드 해제(명시적 절전 모드 해제와 연결되지 않음) 및 도난당한 절전 모드 해제(다른 스레드가 절전 모드 해제 전에 실행되도록 관리됨)의 영향을 받습니다. 따라서 절전 모드 작업이 반환된 후 조건자(일반적으로 while 루프)를 다시 확인해야 합니다.
WakeConditionVariable 또는 WakeAllConditionVariable을 사용하여 조건 변수와 연결된 잠금 내부 또는 외부에서 다른 스레드를 절전 모드 해제할 수 있습니다. 일반적으로 컨텍스트 스위치 수를 줄이기 위해 다른 스레드를 해제하기 전에 잠금을 해제하는 것이 좋습니다.
동일한 잠금으로 둘 이상의 조건 변수를 사용하는 것이 편리한 경우가 많습니다. 예를 들어 판독기/기록기 잠금의 구현은 단일 중요 섹션을 사용할 수 있지만 판독기와 기록기에는 별도의 조건 변수를 사용할 수 있습니다.
관련 항목