Namespaces
Variants

std:: unique_lock

From cppreference.net
Concurrency support library
Threads
(C++11)
(C++20)
this_thread namespace
(C++11)
(C++11)
Cooperative cancellation
Mutual exclusion
Generic lock management
(C++11)
(C++11)
unique_lock
(C++11)
(C++11)
(C++11)
Condition variables
(C++11)
Semaphores
Latches and Barriers
(C++20)
(C++20)
Futures
(C++11)
(C++11)
(C++11)
Safe reclamation
Hazard pointers
Atomic types
(C++11)
(C++20)
Initialization of atomic types
(C++11) (deprecated in C++20)
(C++11) (deprecated in C++20)
Memory ordering
(C++11) (deprecated in C++26)
Free functions for atomic operations
Free functions for atomic flags
헤더 파일에 정의됨 <mutex>
template < class Mutex >
class unique_lock ;
(C++11부터)

unique_lock 클래스는 지연된 잠금, 시간 제한 잠금 시도, 재귀적 잠금, 잠금 소유권 이전, 그리고 조건 변수와의 사용을 허용하는 범용 뮤텍스 소유권 래퍼입니다.

unique_lock 클래스는 이동 가능하지만 복사는 불가능합니다 -- 이 클래스는 MoveConstructible MoveAssignable 요구 사항은 충족하지만 CopyConstructible CopyAssignable 요구 사항은 충족하지 않습니다.

unique_lock 클래스는 BasicLockable 요구 사항을 충족합니다. Mutex Lockable 요구 사항을 충족하는 경우, unique_lock 또한 Lockable 요구 사항을 충족합니다(예: std::lock 에서 사용 가능); Mutex TimedLockable 요구 사항을 충족하는 경우, unique_lock 또한 TimedLockable 요구 사항을 충족합니다.

목차

템플릿 매개변수

Mutex - 잠글 뮤텍스의 유형. 해당 유형은 BasicLockable 요구사항을 충족해야 함

중첩 타입

유형 정의
mutex_type Mutex

멤버 함수

unique_lock 을 생성하며, 선택적으로 제공된 뮤텍스를 잠금(즉, 소유권 획득)
(public member function)
연결된 뮤텍스의 잠금을 해제(즉, 소유권 반환)합니다 (소유 중인 경우)
(public member function)
현재 뮤텍스의 잠금을 해제(즉, 소유권 반환)하고 다른 뮤텍스의 소유권을 획득합니다
(public member function)
잠금
연결된 뮤텍스를 잠금(즉, 소유권 획득)합니다
(public member function)
블로킹 없이 연결된 뮤텍스를 잠그려고 시도합니다(즉, 소유권 획득)
(public member function)
연결된 TimedLockable 뮤텍스를 잠그려고 시도합니다(즉, 소유권 획득), 지정된 시간 동안 뮤텍스를 사용할 수 없는 경우 반환됩니다
(public member function)
연결된 TimedLockable 뮤텍스를 잠그려고 시도합니다(즉, 소유권 획득), 지정된 시간 지점까지 뮤텍스를 사용할 수 없는 경우 반환됩니다
(public member function)
연결된 뮤텍스의 잠금을 해제합니다(즉, 소유권 반환)
(public member function)
수정자
다른 std::unique_lock 과 상태를 교환합니다
(public member function)
연결된 뮤텍스를 잠금 해제하지 않고(즉, 소유권을 반환하지 않고) 분리합니다
(public member function)
관찰자
연결된 뮤텍스에 대한 포인터를 반환합니다
(public member function)
잠금이 연결된 뮤텍스를 소유하는지(즉, 잠금 상태인지) 테스트합니다
(public member function)
잠금이 연결된 뮤텍스를 소유하는지(즉, 잠금 상태인지) 테스트합니다
(public member function)

비멤버 함수

std::swap 알고리즘을 특수화함
(함수 템플릿)

참고 사항

초보자가 자주 하는 실수 중 하나는 unique_lock 변수에 이름을 "잊어버리는" 것입니다. 예를 들어 std :: unique_lock ( mtx ) ; (이는 mtx 라는 이름의 unique_lock 변수를 기본 생성합니다) 또는 std :: unique_lock { mtx } ; (이는 즉시 소멸되는 prvalue 객체를 생성합니다)와 같이 작성하여, 실제로 스코프 전체에 걸쳐 뮤텍스를 보유하는 lock을 생성하지 못하게 되는 경우입니다.

예제

#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)
{
    // 아직 락을 획득하지 않음
    std::unique_lock lock1{from.m, std::defer_lock};
    std::unique_lock lock2{to.m, std::defer_lock};
    // 데드락 없이 두 unique_lock 모두 락
    std::lock(lock1, lock2);
    from.num_things -= num;
    to.num_things += num;
    // "from.m"과 "to.m" 뮤텍스는 unique_lock 소멸자에서 언락됨
}
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> 에서 중복된 deduction guide가 제공됨 제거됨

참고 항목

(C++11)
지정된 뮤텍스들을 잠그며, 사용 불가능한 경우 블록합니다
(function template)
(C++11)
엄격한 범위 기반 뮤텍스 소유권 래퍼를 구현합니다
(class template)
데드락을 회피하는 다중 뮤텍스 RAII 래퍼
(class template)
(C++11)
기본 상호 배제 기능을 제공합니다
(class)