std:: unique_lock
|
헤더 파일에 정의됨
<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) |
|
비멤버 함수
|
(C++11)
|
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) |
|
(C++17)
|
데드락을 회피하는 다중 뮤텍스 RAII 래퍼
(class template) |
|
(C++11)
|
기본 상호 배제 기능을 제공합니다
(class) |