lock_tag — 락 태그 타입

lock_tag — 락 태그 타입 (lock tag types)

std::defer_lock, std::try_to_lock, std::adopt_lock(및 그 태그 타입 defer_lock_t, try_to_lock_t, adopt_lock_t)은 unique_lock/scoped_lock 등에 락 획득 방식을 알려주는 빈 태그 객체들이에요. C++11에서 도입됐어요. <mutex> 헤더에 있어요.

출처: cppreference

본문

// <mutex> 헤더, C++11
struct defer_lock_t { explicit defer_lock_t() = default; };   // (1)
constexpr std::defer_lock_t defer_lock {};                    // (2)
struct try_to_lock_t { explicit try_to_lock_t() = default; }; // (3)
constexpr std::try_to_lock_t try_to_lock {};                  // (4)
struct adopt_lock_t { explicit adopt_lock_t() = default; };   // (5)
constexpr std::adopt_lock_t adopt_lock {};                    // (6)

태그의 의미

태그 의미
defer_lock 잠그지 않고 소유권을 나중으로 미룸
try_to_lock 즉시 잠금 시도 (실패 시 소유 안 함)
adopt_lock 이미 잠긴 뮤텍스의 소유권을 인계받음

사용 예 — unique_lock과 함께

#include <mutex>

std::mutex m;

// 1. defer_lock — 나중에 수동 lock
std::unique_lock<std::mutex> lk1(m, std::defer_lock);
lk1.lock();            // 지연 후 잠금

// 2. try_to_lock — 즉시 시도
std::unique_lock<std::mutex> lk2(m, std::try_to_lock);
if (lk2.owns_lock()) {
    // 잠금 성공
}

// 3. adopt_lock — 이미 잠긴 m의 소유권 인계
m.lock();
std::unique_lock<std::mutex> lk3(m, std::adopt_lock);  // 나중에 unlock은 lk3가

scoped_lock과 함께 쓰면 여러 뮤텍스를 안전하게 다룰 수 있어요.

std::scoped_lock lk(m1, m2);   // 태그 없이 여러 뮤텍스 잠금

이 태그들은 락 래퍼에게 "어떻게 락을 획득할 것인가"(즉시 잠금 vs 지연 vs 시도 vs 인계)를 명시적으로 알려주는 데 사용돼요.

더 알아보기 (Learn more)

cppreference