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