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 요구 사항을 만족해야 해요. |
중첩 타입
멤버 함수
| (생성자) |
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