std:: recursive_mutex
From cppreference.net
C++
Concurrency support library
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
std::recursive_mutex
| Member functions | ||||
| Locking | ||||
| Native handle | ||||
|
헤더 파일에 정의됨
<mutex>
|
||
|
class
recursive_mutex
;
|
(C++11부터) | |
recursive_mutex
클래스는 여러 스레드에 의해 동시에 접근되는 것을 방지하기 위해 공유 데이터를 보호하는 데 사용할 수 있는 동기화 기본 요소입니다.
recursive_mutex
는 배타적이고 재귀적인 소유권 의미론을 제공합니다:
-
호출 스레드는
lock또는try_lock을 성공적으로 호출했을 때부터recursive_mutex를 소유 하는 기간이 시작됩니다. 이 기간 동안 스레드는lock또는try_lock을 추가적으로 호출할 수 있습니다. 소유 기간은 스레드가unlock을 호출한 횟수가 일치할 때 종료됩니다. -
한 스레드가
recursive_mutex를 소유하고 있을 때, 다른 모든 스레드는recursive_mutex의 소유권을 획득하려고 시도하면 (lock호출 시) 차단되거나 (try_lock호출 시) false 값을 반환받게 됩니다. -
recursive_mutex가 잠길 수 있는 최대 횟수는 명시되어 있지 않지만, 해당 횟수에 도달한 후에는lock호출 시 std::system_error 를 throw하고,try_lock호출 시 false 를 반환합니다.
어떤 스레드가 여전히 소유하고 있는 상태에서
recursive_mutex
가 파괴되면 프로그램의 동작은 정의되지 않습니다.
recursive_mutex
클래스는
Mutex
와
StandardLayoutType
의 모든 요구 사항을 충족합니다.
목차 |
멤버 타입
| 멤버 타입 | 정의 |
native_handle_type
(
선택적*
)
|
구현 정의 |
멤버 함수
|
뮤텍스를 생성함
(public member function) |
|
|
뮤텍스를 파괴함
(public member function) |
|
|
operator=
[deleted]
|
복사 할당 불가
(public member function) |
Locking |
|
|
뮤텍스를 잠금, 뮤텍스를 사용할 수 없는 경우 차단됨
(public member function) |
|
|
뮤텍스 잠금을 시도함, 뮤텍스를 사용할 수 없는 경우 반환됨
(public member function) |
|
|
뮤텍스 잠금을 해제함
(public member function) |
|
Native handle |
|
|
기본 구현 정의 네이티브 핸들 객체를 반환함
(public member function) |
|
예제
recursive_mutex
의 한 가지 사용 사례는 멤버 함수들이 서로를 호출할 수 있는 클래스에서 공유 상태를 보호하는 것입니다.
이 코드 실행
#include <iostream> #include <mutex> #include <thread> class X { std::recursive_mutex m; std::string shared; public: void fun1() { std::lock_guard<std::recursive_mutex> lk(m); shared = "fun1"; std::cout << "in fun1, shared variable is now " << shared << '\n'; } void fun2() { std::lock_guard<std::recursive_mutex> lk(m); shared = "fun2"; std::cout << "in fun2, shared variable is now " << shared << '\n'; fun1(); // recursive lock becomes useful here std::cout << "back in fun2, shared variable is " << shared << '\n'; } }; int main() { X x; std::thread t1(&X::fun1, &x); std::thread t2(&X::fun2, &x); t1.join(); t2.join(); }
가능한 출력:
in fun1, shared variable is now fun1 in fun2, shared variable is now fun2 in fun1, shared variable is now fun1 back in fun2, shared variable is fun1
참고 항목
|
(C++11)
|
기본 상호 배제 기능을 제공함
(class) |