unique_lock — std::unique_lock

unique_lock — std::unique_lock

std::unique_lock 클래스는 지연 잠금, 시간 제한 잠금 시도, 재귀 잠금, 잠금 소유권 이전, 조건 변수와 함께 사용을 허용하는 범용 뮤텍스 소유권 래퍼예요. C++11에서 도입됐어요. <mutex> 헤더에 있어요.

std::lock_guard보다 유연하지만 약간의 오버헤드가 있어요.

출처: cppreference

본문

// <mutex> 헤더, C++11
template< class Mutex >
class unique_lock;

사용 예 — 기본

#include <mutex>

std::mutex m;

std::unique_lock<std::mutex> lk(m);   // 생성 시 잠금
// 보호 영역
// 소멸 시 자동 해제

여러 모드

std::unique_lock<std::mutex> a(m, std::defer_lock);   // 잠그지 않음
a.lock();      // 나중에 잠금

std::unique_lock<std::mutex> b(m, std::try_to_lock);  // 즉시 시도
if (b.owns_lock()) { /* ... */ }

std::unique_lock<std::mutex> c(m, std::adopt_lock);   // 이미 잠긴 m 소유

락 조작

std::unique_lock<std::mutex> lk(m);
lk.unlock();      // 수동 해제 (블로킹 영역 밖)
lk.lock();        // 재잠금
bool owns = lk.owns_lock();   // 소유 여부
std::mutex* pm = lk.release(); // 소유권 포기 (연결 해제)

조건 변수와 함께 (핵심 용도)

std::condition_variable cv;
std::mutex m;

// wait는 unique_lock을 필요로 함 (임시 잠금 해제·재락)
std::unique_lock<std::mutex> lk(m);
cv.wait(lk, []{ return ready; });

특징

  • 이동 가능 — 잠금 소유권을 다른 unique_lock으로 옮길 수 있어요.
  • lock_guard보다 유연: 지연, 시간 제한, 수동 unlock, 소유권 이전.
  • condition_variable::wait에 필수로 사용.

std::unique_lock은 원하는 시점에 자유롭게 잠그고 풀고, 조건 변수 대기와 함께 쓸 수 있는 유연한 뮤텍스 래퍼예요.

더 알아보기 (Learn more)

cppreference