다른 스레드가 공유 변수를 수정하고 Condition_Variable로 통지할 때까지 스레드나 여러 스레드를 대기하도록 하는데 사용할 수 있는 동기화 기법
C++의 조건 변수(Condition Variable)는 멀티스레딩 환경에서 스레드 간 동기화와 통신을 위한 중요한 도구 중 하나다. 조건 변수는 C++의 표준 라이브러리인 `<condition_variable>` 헤더에서 제공된다.
조건 변수는 주로 다음과 같은 상황에서 사용된다:
1. 스레드 대기(Waiting): 하나 이상의 스레드가 특정 조건이 충족될 때까지 대기하도록 만든다. 이 조건은 다른 스레드가 어떤 작업을 마치고 조건 변수를 통해 대기 중인 스레드에게 신호를 보낼 때까지 대기한다.
2. 스레드 깨우기(Notify): 조건이 충족되었을 때, 다른 스레드에게 대기 중인 스레드를 깨우도록 허용한다.
3. 뮤텍스와 함께 사용(Mutex): 조건 변수는 일반적으로 뮤텍스(락)와 함께 사용된다. 뮤텍스는 공유 데이터에 대한 동시 액세스를 제어하며, 조건 변수는 스레드 간의 통신을 담당한다.
- `std::condition_variable`: 조건 변수 객체를 생성합니다.
- `std::condition_variable::wait(lock)`: 스레드를 대기 상태로 만들고, 다른 스레드가 `notify` 또는 `notify_all` 메서드를 호출할 때까지 대기합니다. `lock` 매개변수는 뮤텍스 또는 다른 락 객체를 전달합니다.
- `std::condition_variable::notify_one()`: 대기 중인 하나의 스레드를 깨웁니다.
- `std::condition_variable::notify_all()`: 대기 중인 모든 스레드를 깨웁니다.
조건 변수를 사용하여 스레드 간에 안전하게 데이터를 공유하고 동기화할 수 있으며, 스레드 간 통신을 효과적으로 관리할 수 있다. 그러나 조건 변수를 올바르게 사용하려면 주의 깊게 설계해야 하며, 데드락과 같은 문제를 방지하기 위해 뮤텍스와 함께 사용해야 한다.
예시)


WorkerThread내부에서 std::mutex를 이용한 std::unique_lock을 생성하고 cv_job_q 조건변수에 넘겨주며 wait한다. wait시에 작성된 람다함수가 true를 반환할 때만 que에서 job을 꺼내어 실행시키며 unlock한다.
'C++' 카테고리의 다른 글
Lambda(람다) (0) | 2023.10.01 |
---|---|
좌측값(lvalue) & 우측값(rvalue) (0) | 2023.10.01 |
RAII(Resource Acguisition Is Initialization) (0) | 2023.09.30 |
std::ranges::range (0) | 2023.09.30 |
좁히기 변환(축소변환) & 확대 변환 (0) | 2023.09.30 |