[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++에서는 다양한 동기화 기술을 제공하여 개발자가 효율적으로 다중 스레드 환경을 다룰 수 있도록 지원하고 있습니다.