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(쓰기)으로 감싸 써요.

더 알아보기 (Learn more)

cppreference