[c++] C++에서의 동기화 개념

C++에서 동기화(synchronization)란 여러 스레드가 공유된 자원에 동시에 접근하는 상황에서 발생하는 문제를 해결하는 기술을 의미합니다. 이는 여러 스레드가 동시에 자원을 읽거나 쓰는 경우, 예측할 수 없는 결과가 발생할 수 있기 때문에 중요합니다.

동시성 문제를 해결하기 위해 C++에서는 다양한 방법을 제공합니다. 가장 일반적인 방법으로는 뮤텍스(mutex), 세마포어(semaphore), 조건 변수(condition variable) 등을 활용하는 것이 있습니다.

뮤텍스(Mutex)

뮤텍스는 오직 하나의 스레드만이 접근할 수 있는 잠금 기능을 제공합니다. 즉, 임계 영역에 진입하는 스레드는 다른 스레드가 해당 영역을 점유하지 않을 때까지 기다려야 합니다.

#include <mutex>

std::mutex mtx;

void criticalSection()
{
    std::lock_guard<std::mutex> lock(mtx);
    // 임계 영역의 코드 실행
}

세마포어(Semaphore)

세마포어는 뮤텍스와 유사하지만, 여러 개의 스레드가 동시에 접근할 수 있도록 제어하는 카운터 기능을 제공합니다.

#include <semaphore>

std::counting_semaphore<5> sem(5); // 최대 5개의 스레드가 동시에 접근 가능

void criticalSection()
{
    sem.acquire(); // 세마포어 획득
    // 임계 영역의 코드 실행
    sem.release(); // 세마포어 해제
}

조건 변수(Condition Variable)

조건 변수는 특정 조건이 만족될 때까지 스레드를 대기시키고, 조건이 만족되면 깨우는 기능을 제공합니다.

#include <condition_variable>
#include <mutex>

std::condition_variable cv;
std::mutex mtx;
bool ready = false;

void waitForCondition()
{
    std::unique_lock<std::mutex> lock(mtx);
    cv.wait(lock, [] { return ready; }); // 조건이 참일 때까지 대기
    // 조건이 만족되면 계속 실행
}

void notifyCondition()
{
    std::lock_guard<std::mutex> lock(mtx);
    ready = true;
    cv.notify_one(); // 대기 중인 스레드 중 하나를 깨움
}

동기화는 다중 스레드 환경에서 발생할 수 있는 문제를 방지하고 안전한 프로그래밍을 위해 중요한 개념이므로, C++에서는 다양한 동기화 기술을 제공하여 개발자가 효율적으로 다중 스레드 환경을 다룰 수 있도록 지원하고 있습니다.