반응형
상호배제(Mutual Exclusion, Mutex)란?
상호배제란, 여러 개의 스레드가 공유 자원(변수, 파일, 메모리 등)에 동시에 접근하는 것을 막는 기술을 의미한다.
쉽게 말하자면, 화장실(공유 자원)이 하나뿐인 카페에서 화장실 열쇠(Mutex)를 가진 사람만 안에 들어갈 수 있게 제한하는 것이다.

상호배제가 필요한 이유
여러 스레드가 동일한 데이터를 수정하려고 하면 데이터가 꼬이는 현상이 발생한다.
- 문제 상황 : 스레드 A와 B가 동시에 변수 count = 0에 1을 더하려고 한다.
- 기대 결과 : 2
- 실제 결과 : 두 스레드가 동시에 count를 읽어가서 각자 1로 덮어쓰면 최종결과는 1이 될 수 있다.
상호배제 사용하기
- std::mutex는 가장 기본적인 뮤텍스 객체이다.
- lock(), unlock()을 통해서 자원을 잠그고 해제하는게 가능하다.
- std::lock_guard / std::unique_lock : RAII 패턴을 사용해서 코드 블록을 벗어날 때 자동으로 unlock을 시켜준다.
#include <iostream>
#include <thread>
#include <mutex>
#include <vector>
using namespace std;
std::mutex mtx;
int counter = 0;
// lock(), unlock()을 사용하는 경우
void increase()
{
for (int i = 0; i < 1000; i++)
{
mtx.lock();
counter++;
mtx.unlock();
}
}
// std::lock_guard를 사용하는 경우
void increase()
{
for (int i = 0; i < 1000; i++)
{
std::lock_guard<std::mutex> lock(mtx);
counter++;
}
}
int main()
{
std::thread t1(increase);
std::thread t2(increase);
t1.join();
t2.join();
std::cout << "최종 결과: " << counter << std::endl; // 정확히 2000 출력
}


상호 배제 사용시 주의사항
상호 배제는 강력하지만, 잘못 사용하면 데드락(Deadlock)을 발생시킬 수 있음
정리하자면
- 상호배제란, 한 번에 하나만 접근 가능한 보호막을 치는 것으로 공유 자원에 두 스레드가 동시에 접근하는 것을 막는다.
- std::mutex, std::lock_guard를 사용해서 상호배제를 적용한다.
- 데이터 무결성을 지켜주지만, 과도하게 사용하면 성능이 저하되거나 데드락이 발생할 수 있다.
- 간단한 변수의 무결성을 유지하려면 std::atomic을 사용하는 것이 더 나은 선택이 될 수 있다.
'프로그래밍 > C++' 카테고리의 다른 글
| 바쁜 대기(Busy Waiting)에 대해서 알아보자 (0) | 2026.02.01 |
|---|---|
| thread_local 키워드에 대해서 (0) | 2026.01.31 |
| RAII에 대해서 알아보자 (0) | 2026.01.26 |
| C++ 임시 객체에 대해서 (0) | 2026.01.25 |
| unique_ptr vs shared_ptr 차이는 무엇인가? (0) | 2026.01.03 |
댓글