다음을 통해 공유


조건 변수

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

조건 변수를 사용하면 스레드가 잠금을 원자적으로 해제하고 절전 모드 상태로 전환할 수 있습니다. 중요한 섹션 또는 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을 사용하여 조건 변수와 연결된 잠금 내부 또는 외부에서 다른 스레드를 절전 모드 해제할 수 있습니다. 일반적으로 컨텍스트 스위치 수를 줄이기 위해 다른 스레드를 해제하기 전에 잠금을 해제하는 것이 좋습니다.

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

조건 변수 사용