[Deep Dive] 쓰레드와 병렬 프로그래밍 - 3탄 동기화 기법 조건 변수 (Condition Variable)

조건 변수란?

조건 변수(Condition Variable)공유 자원의 상태가 어떤 조건을 만족할 때까지 쓰레드를 기다리게 하거나, 그 조건이 만족되면 다른 쓰레드를 깨우는 동기화 도구다.

조건 변수의 동작 구조

조건 변수는 반드시 mutex와 함께 사용된다.

전형적인 흐름

1. 쓰레드 A:

pthread_mutex_lock(&mutex);
while (조건이 false)
    pthread_cond_wait(&cond, &mutex); // 대기 상태 진입
// 조건이 만족되면 계속 진행
pthread_mutex_unlock(&mutex);

2. 쓰레드 B (조건 만족시키는 측):

pthread_mutex_lock(&mutex);
// 조건을 true로 만드는 작업
pthread_cond_signal(&cond); // A를 깨움
pthread_mutex_unlock(&mutex);

관련 함수 설명

1. pthread_cond_t 선언

pthread_cond_t cond = PTHREAD_COND_INITIALIZER;

2. pthread_cond_init

int pthread_cond_init(pthread_cond_t *cond, const pthread_condattr_t *attr);
  • 조건 변수 초기화. attr은 NULL로 보통 사용

3. pthread_cond_wait

int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex);
  • 호출한 쓰레드는 조건 변수 cond에서 기다림
  • 내부적으로 mutex는 자동으로 unlock 됨
  • 다른 쓰레드가 signal 하거나 broadcast 할 때까지 블로킹
  • 깨어나면 다시 mutex를 lock 한 상태로 돌아옴

주의: 항상 while (조건이 false) 루프 안에서 써야 함.
spurious wakeup (가짜 깨움) 방지를 위해

4. pthread_cond_signal

int pthread_cond_signal(pthread_cond_t *cond);
  • 조건 변수에서 기다리는 쓰레드 중 하나를 깨움

5. pthread_cond_broadcast

int pthread_cond_broadcast(pthread_cond_t *cond);
  • 기다리는 모든 쓰레드를 깨움 (ex: 생산자/소비자 모델에서 필요)

6. pthread_cond_destroy

int pthread_cond_destroy(pthread_cond_t *cond);

조건 변수 해제. pthread_cond_init로 만든 경우 반드시 호출