Application/기초

[기초] C++ 동기화 기법 (Mutex와 Semaphore)

devsalix 2024. 4. 30. 07:14
728x90

 

C++에서 멀티스레드 프로그래밍을 할 때, 동기화는 중요한 주제 중 하나입니다.

여러 스레드가 공유 자원에 안전하게 접근할 수 있도록 하는 것이 동기화의 목적입니다.

이를 위해 C++에서는 주로 Mutex와 Semaphore라는 동기화 기법을 사용합니다.

이번 포스팅에서는 이 두 가지 기법에 대해 자세히 알아보겠습니다.

 


 

Mutex (상호 배제)

 

Mutex는 Mutual Exclusion(상호 배제)의 줄임말로,

한 번에 한 스레드만 공유 자원에 접근할 수 있도록 하는 동기화 기법입니다.

일종의 잠금장치로, 어떤 스레드가 공유 자원에 접근할 때 다른 스레드들은 대기 상태로 들어갑니다.

 

#include <iostream>
#include <thread>
#include <mutex>

std::mutex mtx;

void critical_section() {
    mtx.lock(); // 잠금 획득
    // 공유 자원에 대한 작업 수행
    mtx.unlock(); // 잠금 해제
}

int main() {
    std::thread t1(critical_section);
    std::thread t2(critical_section);

    t1.join();
    t2.join();

    return 0;
}

 

Semaphore (세마포어)

 

Semaphore는 정해진 개수만큼의 스레드가 공유 자원에 접근할 수 있도록 하는 동기화 기법입니다.

Mutex와 달리 동시에 여러 스레드가 접근할 수 있습니다.

Semaphore는 기본적으로 "카운팅 세마포어"와 "이진 세마포어" 두 가지 타입이 있습니다.

 

#include <iostream>
#include <thread>
#include <mutex>
#include <semaphore>

sem_t semaphore;

void critical_section() {
    sem_wait(&semaphore); // 세마포어 값 감소
    // 공유 자원에 대한 작업 수행
    sem_post(&semaphore); // 세마포어 값 증가
}

int main() {
    sem_init(&semaphore, 0, 1); // 세마포어 초기화

    std::thread t1(critical_section);
    std::thread t2(critical_section);

    t1.join();
    t2.join();

    sem_destroy(&semaphore); // 세마포어 제거

    return 0;
}

 

마무리

 

Mutex와 Semaphore는 멀티스레드 환경에서 공유 자원에 안전하게 접근하기 위한 중요한 동기화 기법입니다.

이러한 기법들을 적절히 활용하여 프로그램의 안정성과 성능을 향상시킬 수 있습니다.

 

 


제 글이 도움이 되셨다면 댓글 & 공감 부탁드려요 😀

 

 
반응형