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는 멀티스레드 환경에서 공유 자원에 안전하게 접근하기 위한 중요한 동기화 기법입니다.
이러한 기법들을 적절히 활용하여 프로그램의 안정성과 성능을 향상시킬 수 있습니다.
제 글이 도움이 되셨다면 댓글 & 공감 부탁드려요 😀
반응형
'Application > 기초' 카테고리의 다른 글
[기초] C++ 컨테이너 (Containers) (0) | 2024.05.02 |
---|---|
[기초] C++ this 포인터 : 객체의 자기 참조 (0) | 2024.05.01 |
[기초] C++ 멀티스레딩 (Thread) (0) | 2024.04.29 |
[기초] C++ 템플릿 (Templates) (2) | 2024.04.28 |
[기초] C++ 가변 파라미터 (2) | 2024.04.27 |