다음을 통해 공유


조건 변수

조건 변수는 스레드가 특정 조건이 발생할 때까지 대기할 수 있도록 하는 동기화 기본 형식입니다. 조건 변수는 프로세스 간에 공유할 수 없는 사용자 모드 개체입니다.

조건 변수를 사용하면 스레드가 잠금을 원자 단위로 해제하고 절전 모드로 전환할 수 있습니다. 중요한 섹션 또는 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 함수는 현재 잠금 요청이 기존 소유자와 호환되는지 확인합니다. 이 경우 잠금을 획득합니다. 그렇지 않으면 절전 모드입니다. 자세한 예제는 조건 변수 사용 참조하세요.

조건 변수는 가짜 절전 모드 해제(명시적 절전 모드 해제와 연결되지 않음) 및 도난당한 절전 모드 해제(다른 스레드가 절전 모드 해제 전에 실행되도록 관리됨)의 영향을 받습니다. 따라서 절전 작업이 반환된 후 조건자(일반적으로 루프를 동안)를 다시 확인해야 합니다.

WakeConditionVariable사용하여 다른 스레드를 절전 모드 해제하거나 조건 변수와 연결된 잠금 내부 또는 외부에서 WakeAllConditionVariable수 있습니다. 일반적으로 컨텍스트 전환 수를 줄이기 위해 다른 스레드를 깨우기 전에 잠금을 해제하는 것이 좋습니다.

동일한 잠금을 사용하여 둘 이상의 조건 변수를 사용하는 것이 편리한 경우가 많습니다. 예를 들어 판독기/기록기 잠금의 구현은 단일 중요 섹션을 사용하지만 판독기와 작성기에는 별도의 조건 변수를 사용할 수 있습니다.

조건 변수 사용하여