std:: defer_lock, std:: try_to_lock, std:: adopt_lock, std:: defer_lock_t, std:: try_to_lock_t, std:: adopt_lock_t
From cppreference.net
C++
Concurrency support library
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
헤더에 정의됨
<mutex>
|
||
|
struct
defer_lock_t
{
explicit
defer_lock_t
(
)
=
default
;
}
;
|
(1) | (C++11부터) |
|
constexpr
std::
defer_lock_t
defer_lock
{
}
;
|
(2) |
(C++11부터)
(C++17부터 inline) |
|
struct
try_to_lock_t
{
explicit
try_to_lock_t
(
)
=
default
;
}
;
|
(3) | (C++11부터) |
|
constexpr
std::
try_to_lock_t
try_to_lock
{
}
;
|
(4) |
(C++11부터)
(C++17부터 inline) |
|
struct
adopt_lock_t
{
explicit
adopt_lock_t
(
)
=
default
;
}
;
|
(5) | (C++11부터) |
|
constexpr
std::
adopt_lock_t
adopt_lock
{
}
;
|
(6) |
(C++11부터)
(C++17부터 inline) |
1,3,5)
빈 클래스 태그 타입
std::defer_lock_t
,
std::try_to_lock_t
그리고
std::adopt_lock_t
는
std::unique_lock
과
std::shared_lock
의 생성자 매개변수 목록에서 락킹 전략을 지정하기 위해 사용될 수 있습니다.
2,4,6)
해당하는
std::defer_lock
,
std::try_to_lock
및
std::adopt_lock
인스턴스들이
(1,3,5)
생성자에 전달되어 잠금 전략 유형을 나타낼 수 있습니다.
클래스 템플릿
std::lock_guard
의 생성자 중 하나는 태그
std::adopt_lock
만을 허용합니다.
| 유형 | 효과 |
defer_lock_t
|
뮤텍스의 소유권을 획득하지 않음 |
try_to_lock_t
|
블로킹 없이 뮤텍스의 소유권 획득 시도 |
adopt_lock_t
|
호출 스레드가 이미 뮤텍스의 소유권을 가지고 있다고 가정 |
예제
이 코드 실행
#include <iostream> #include <mutex> #include <thread> struct bank_account { explicit bank_account(int balance) : balance{balance} {} int balance; std::mutex m; }; void transfer(bank_account& from, bank_account& to, int amount) { if (&from == &to) // 자기 자신에게 이체하는 경우 데드락 방지 return; // 데드락 없이 두 뮤텍스 모두 잠금 std::lock(from.m, to.m); // 이미 잠긴 두 뮤텍스가 스코프 종료 시 해제되도록 보장 std::lock_guard lock1{from.m, std::adopt_lock}; std::lock_guard lock2{to.m, std::adopt_lock}; // 동등한 접근 방식: // std::unique_lock<std::mutex> lock1{from.m, std::defer_lock}; // std::unique_lock<std::mutex> lock2{to.m, std::defer_lock}; // std::lock(lock1, lock2); from.balance -= amount; to.balance += amount; } int main() { bank_account my_account{100}; bank_account your_account{50}; std::thread t1{transfer, std::ref(my_account), std::ref(your_account), 10}; std::thread t2{transfer, std::ref(your_account), std::ref(my_account), 5}; t1.join(); t2.join(); std::cout << "my_account.balance = " << my_account.balance << "\n" "your_account.balance = " << your_account.balance << '\n'; }
출력:
my_account.balance = 95 your_account.balance = 55
참고 항목
lock_guard
를 생성하며, 주어진 뮤텍스를 선택적으로 잠금
(
std::lock_guard<Mutex>
의 public 멤버 함수)
|
|
unique_lock
를 생성하며, 제공된 뮤텍스를 선택적으로 잠금(즉, 소유권 획득)
(
std::unique_lock<Mutex>
의 public 멤버 함수)
|