[c++] C++에서의 뮤텍스와 조건 변수 (Condition variable) 사용

C++에서 뮤텍스와 조건 변수는 병행 프로그래밍을 구현하는 데 중요한 개념입니다. 이 두 요소를 사용하면 스레드 간의 안전한 데이터 공유와 동기화를 쉽게 구현할 수 있습니다.

뮤텍스 (Mutex)

뮤텍스는 상호 배제를 위해 사용됩니다. 하나의 스레드만이 특정 코드 블록 또는 리소스에 접근할 수 있도록 합니다. C++에서는 <mutex> 헤더를 사용하여 뮤텍스를 제공합니다.

#include <mutex>

std::mutex mtx;

void someFunction() {
    std::lock_guard<std::mutex> lock(mtx);
    // 임계 구역 (Critical section)
    // ...
}

std::lock_guard는 뮤텍스를 손쉽게 사용할 수 있도록 해주는 유틸리티 클래스입니다. 이를 사용하여 뮤텍스 블록을 만들고 특정 코드 영역을 보호할 수 있습니다.

조건 변수 (Condition variable)

조건 변수는 스레드 간의 통신을 위해 사용됩니다. 특정 조건이 충족될 때까지 스레드를 대기 상태로 전환하고, 조건이 발생하면 대기 중인 스레드를 깨우는 데 사용됩니다. C++에서는 <condition_variable> 헤더를 사용하여 조건 변수를 제공합니다.

#include <condition_variable>

std::condition_variable cv;

void someFunction() {
    std::unique_lock<std::mutex> lock(mtx);
    while (!condition) {
        cv.wait(lock);
    }
    // 조건이 충족되었을 때 수행하는 작업
    // ...
    cv.notify_one(); // 대기 중인 스레드 깨우기
}

std::unique_lock은 뮤텍스와 조건 변수를 함께 사용할 때 편리하게 사용할 수 있는 래퍼 클래스입니다. 조건이 충족되기 전까지 cv.wait 메서드를 사용하여 스레드를 대기 상태로 전환하고, 조건이 충족되면 cv.notify_one을 사용하여 대기 중인 스레드를 깨울 수 있습니다.

요약

C++에서의 뮤텍스와 조건 변수는 병행 프로그래밍을 위해 중요한 도구입니다. 뮤텍스는 상호 배제를, 조건 변수는 스레드 간의 통신을 가능하게 합니다. 이러한 도구들을 사용하여 안전한 병행 프로그래밍을 구현할 수 있습니다.

참고 자료: