mutex — std::mutex
mutex — std::mutex
std::mutex 클래스는 여러 스레드가 동시에 공유 데이터에 접근하는 것을 막는 데 사용하는 동기화 기본 요소예요. C++11에서 도입됐어요. <mutex> 헤더에 있어요.
mutex는 전용(exclusive), 비재귀(non-recursive) 소유권 의미론을 제공해요.
출처: cppreference
본문
// <mutex> 헤더, C++11
class mutex;
mutex는 호출 스레드가 성공적으로 lock()을 호출한 순간부터 그 시점까지 뮤텍스를 소유해요.
주요 연산
| 연산 | 설명 |
|---|---|
lock() |
잠금 (다른 스레드가 소유 중이면 블로킹) |
try_lock() |
즉시 시도 (실패 시 false) |
unlock() |
잠금 해제 |
사용 예
#include <mutex>
#include <thread>
std::mutex m;
int shared = 0;
void increment() {
m.lock(); // 잠금
++shared; // 보호된 영역
m.unlock(); // 해제
}
RAII 권장
직접 lock/unlock을 호출하는 대신 std::lock_guard나 std::unique_lock을 쓰는 것이 안전해요 (예외에도 해제 보장).
void increment_safe() {
std::lock_guard<std::mutex> lk(m); // 자동 lock/unlock
++shared;
}
특징
- 비재귀 — 이미 소유한 스레드가 다시
lock()하면 **데드락(정의되지 않은 동작)**이 돼요. 재귀가 필요하면std::recursive_mutex. try_lock()— 블로킹 없이 시도.- 소유 스레드만
unlock()할 수 있어요.
std::mutex m;
if (m.try_lock()) { // 즉시 성공 여부
// 보호 영역
m.unlock();
} else {
// 다른 스레드가 사용 중
}
std::mutex는 가장 기본적인 상호 배제 도구예요. 실제 사용에서는 lock_guard/unique_lock으로 감싸 쓰는 것이 일반적이에요.