condition_variable — std::condition_variable

condition_variable — std::condition_variable

std::condition_variablestd::mutex와 함께 사용되어, 한 스레드가 공유 변수(조건)를 수정하고 std::condition_variable을 알릴(notify) 때까지 하나 이상의 스레드를 막는 동기화 기본 요소예요. C++11에서 도입됐어요. <condition_variable> 헤더에 있어요.

출처: cppreference

본문

// <condition_variable> 헤더, C++11
class condition_variable;

생산자-소비자 예

#include <condition_variable>
#include <mutex>
#include <queue>
#include <iostream>

std::mutex m;
std::condition_variable cv;
std::queue<int> q;

void producer() {
    for (int i = 0; i < 5; ++i) {
        {
            std::lock_guard<std::mutex> lk(m);
            q.push(i);
        }
        cv.notify_one();   // 소비자에게 알림
    }
}

void consumer() {
    while (true) {
        std::unique_lock<std::mutex> lk(m);
        cv.wait(lk, []{ return !q.empty(); });   // 조건 만족까지 대기
        int v = q.front();
        q.pop();
        lk.unlock();
        std::cout << v << ' ';
    }
}

핵심 연산

연산 설명
wait(lock) 락 해제 후 대기, 깨어나면 재락
wait(lock, pred) predicate가 참이 될 때까지 대기
wait_for(lock, dur) / wait_until(lock, tp) 시간 제한 대기
notify_one() 하나의 대기 스레드 깨움
notify_all() 모든 대기 스레드 깨움

특징

  • std::unique_lock<std::mutex>에서만 동작 (condition_variable_any는 일반 락 지원).
  • wait는 반드시 predicate 버전((pred)을 쓰는 것이 안전해요 — 스퍼리어스 웨이크업·신호 손실 방지.
  • notify는 대기 스레드 수와 상관없이 안전해요.
// 시간 제한 대기
std::unique_lock<std::mutex> lk(m);
if (cv.wait_for(lk, std::chrono::seconds(1),
                []{ return ready; })) {
    // ready가 참
} else {
    // 시간 초과
}

condition_variable은 "어떤 조건이 만족될 때까지 잠들고, 만족되면 깨어나도록" 하는 쓰레드 동기화의 핵심 도구예요. 반드시 뮤텍스와 함께 써요.

더 알아보기 (Learn more)

cppreference