thread_unique_lock

thread_unique_lock (unique_lock 한국어 레퍼런스)

unique_lock은 일반적인 목적의 뮤텍스 소유권 래퍼예요. 지연 잠금(deferred locking), 시간 제한 잠금 시도, 재귀 잠금, 잠금 소유권 이전, 그리고 조건 변수(condition variable)와 함께 사용할 수 있어요. 이 클래스는 이동은 가능하지만 복사는 불가능해서, MoveConstructible과 MoveAssignable 요구 사항은 만족하지만 CopyConstructible이나 CopyAssignable은 만족하지 않아요.

출처: cppreference

본문

unique_lock은 BasicLockable 요구 사항을 만족해요. Mutex가 Lockable 요구 사항을 만족한다면 unique_lock도 Lockable 요구 사항을 만족해서 std::lock에 사용할 수 있어요. Mutex가 TimedLockable 요구 사항을 만족한다면 unique_lock도 TimedLockable 요구 사항을 만족해요.

템플릿 매개변수

Mutex - 잠글 뮤텍스의 타입이에요. 이 타입은 BasicLockable 요구 사항을 만족해야 해요.

중첩 타입

타입 정의
mutex_type Mutex

멤버 함수

(생성자) unique_lock을 생성하고, 선택적으로 지정된 뮤텍스를 잠가요(즉, 소유권을 가져와요). (공개 멤버 함수)
(소멸자) 소유하고 있다면 연관된 뮤텍스를 잠금 해제해요(즉, 소유권을 놓아줘요). (공개 멤버 함수)
operator= 소유하고 있다면 뮤텍스를 잠금 해제하고, 다른 뮤텍스의 소유권을 가져와요. (공개 멤버 함수)
잠금
lock 연관된 뮤텍스를 잠가요(즉, 소유권을 가져와요). (공개 멤버 함수)
try_lock 블로킹 없이 연관된 뮤텍스를 잠그려고 시도해요(즉, 소유권을 가져와요). (공개 멤버 함수)
try_lock_for 연관된 TimedLockable 뮤텍스를 잠그려고 시도하고, 지정된 시간 동안 뮤텍스를 사용할 수 없으면 반환해요. (공개 멤버 함수)
try_lock_until 연관된 TimedLockable 뮤텍스를 잠그려고 시도하고, 지정된 시점에 도달할 때까지 뮤텍스를 사용할 수 없으면 반환해요. (공개 멤버 함수)
unlock 연관된 뮤텍스를 잠금 해제해요(즉, 소유권을 놓아줘요). (공개 멤버 함수)
변경자
swap 다른 std::unique_lock과 상태를 교환해요. (공개 멤버 함수)
release 잠금 해제(즉, 소유권 해제) 없이 연관된 뮤텍스와의 연결을 끊어요. (공개 멤버 함수)
관찰자
mutex 연관된 뮤텍스에 대한 포인터를 반환해요. (공개 멤버 함수)
owns_lock 잠금이 연관된 뮤텍스를 소유하고 있는지(즉, 잠갔는지) 확인해요. (공개 멤버 함수)
operator bool 잠금이 연관된 뮤텍스를 소유하고 있는지(즉, 잠갔는지) 확인해요. (공개 멤버 함수)

비멤버 함수

std::swap (std::unique_lock) (C++11) std::swap 알고리즘을 특수화해요. (함수 템플릿)

예제

#include <iostream>
#include <mutex>
#include <thread>

struct Box
{
    explicit Box(int num) : num_things{num} {}
    
    int num_things;
    std::mutex m;
};

void transfer(Box& from, Box& to, int num)
{
    // don't actually take the locks yet
    std::unique_lock lock1{from.m, std::defer_lock};
    std::unique_lock lock2{to.m, std::defer_lock};
    
    // lock both unique_locks without deadlock
    std::lock(lock1, lock2);
    
    from.num_things -= num;
    to.num_things += num;
    
    // “from.m” and “to.m” mutexes unlocked in unique_lock dtors
}

int main()
{
    Box acc1{100};
    Box acc2{50};
    
    std::thread t1{transfer, std::ref(acc1), std::ref(acc2), 10};
    std::thread t2{transfer, std::ref(acc2), std::ref(acc1), 5};
    
    t1.join();
    t2.join();
    
    std::cout << "acc1: " << acc1.num_things << "\n"
                 "acc2: " << acc2.num_things << '\n';
}

출력:

acc1: 95
acc2: 55

결함 보고서

다음 동작을 변경하는 결함 보고서는 이전에 공개된 C++ 표준에 소급 적용되었어요.

DR 적용 대상 공개된 동작 올바른 동작
LWG 2981 C++17 unique_lock<Mutex>에서 중복된 추론 가이드가 제공되었음 제거됨

같이 보기

lock (C++11) 지정된 뮤텍스들을 잠그고, 사용할 수 없는 것이 있으면 블로킹해요. (함수 템플릿)
lock_guard (C++11) 엄격한 스코프 기반 뮤텍스 소유권 래퍼를 구현해요. (클래스 템플릿)
scoped_lock (C++17) 여러 뮤텍스를 위한 교착 상태 회피 RAII 래퍼예요. (클래스 템플릿)
mutex (C++11) 기본 상호 배제 기능을 제공해요. (클래스)

더 알아보기 (Learn more)

cppreference