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 인계)를 명시적으로 알려주는 데 사용돼요.