shared_mutex — std::shared_mutex
shared_mutex — std::shared_mutex
std::shared_mutex 클래스는 여러 스레드가 동시에 공유 데이터에 접근하는 것을 막는 데 사용하는 동기화 기본 요소예요. C++17에서 도입됐어요. <shared_mutex> 헤더에 있어요.
배타 접근만을 제공하는 다른 뮤텍스와 달리, shared_mutex는 두 수준의 접근을 가져요.
출처: cppreference
본문
// <shared_mutex> 헤더, C++17
class shared_mutex;
두 수준의 접근
- 공유(shared) 접근 — 여러 스레드가 동시에 읽기(공유 잠금) 가능.
- 배타(exclusive) 접근 — 한 스레드가 쓰기(배타 잠금)만.
주요 연산
| 연산 | 설명 |
|---|---|
lock() / unlock() |
배타(쓰기) 잠금/해제 |
try_lock() |
배타 즉시 시도 |
lock_shared() / unlock_shared() |
공유(읽기) 잠금/해제 |
try_lock_shared() |
공유 즉시 시도 |
사용 예 — 읽기/쓰기 동기화
#include <shared_mutex>
#include <vector>
class Data {
std::vector<int> v;
mutable std::shared_mutex m;
public:
int read() const {
std::shared_lock<std::shared_mutex> lk(m); // 공유(읽기)
return v.empty() ? 0 : v.front();
}
void write(int x) {
std::unique_lock<std::shared_mutex> lk(m); // 배타(쓰기)
v.push_back(x);
}
};
특징
- 읽기-읽기 병행 — 공유 잠금은 여러 스레드가 동시에 가능.
- 쓰기는 배타 — 공유 잠금이 하나라도 있으면 쓰기 잠금 대기.
- 읽기 많은 워크로드에서 성능 향상.
std::shared_timed_mutex(C++14)와 달리 시간 제한 잠금이 없어요.
std::shared_mutex sm;
sm.lock_shared(); // 읽기 잠금
// ... 여러 스레드 동시 읽기
sm.unlock_shared();
std::shared_mutex는 reader-writer 락 패턴을 제공해, 읽기가 지배적인 데이터 구조에 효율적이에요. shared_lock(읽기)과 unique_lock(쓰기)으로 감싸 써요.