thread_recursive_mutex
thread_recursive_mutex (재귀 뮤텍스)
recursive_mutex는 여러 스레드가 공유 데이터에 동시에 접근하는 것을 막기 위해 사용하는 동기화 기본 요소예요. 이 클래스는 재귀적 소유 의미론을 제공해서, 같은 스레드가 이미 소유한 뮤텍스를 다시 잠글 수 있어요. 이 페이지에서는 recursive_mutex의 동작 방식과 사용 예시를 자세히 설명할게요.
출처: cppreference
본문
<mutex> 헤더에 정의되어 있어요. (C++11부터)
| 정의 | |
|---|---|
class recursive_mutex; |
(C++11부터) |
recursive_mutex 클래스는 여러 스레드가 공유 데이터에 동시에 접근하는 것을 보호하기 위해 사용할 수 있는 동기화 기본 요소예요.
recursive_mutex는 배타적이고 재귀적인 소유 의미론을 제공해요:
- 호출 스레드는
lock또는try_lock을 성공적으로 호출하면 그 순간부터 recursive_mutex를 소유해요. 이 기간 동안 스레드는lock이나try_lock을 추가로 호출할 수 있어요. 소유 기간은 스레드가 같은 횟수만큼unlock을 호출할 때 끝나요. - 어떤 스레드가 recursive_mutex를 소유하고 있으면, 다른 모든 스레드는
lock호출 시 블록되거나try_lock호출 시false를 받아요. - recursive_mutex가 잠길 수 있는 최대 횟수는 명시되어 있지 않지만, 그 횟수에 도달하면
lock호출은std::system_error를 던지고try_lock호출은false를 반환해요.
어떤 스레드가 여전히 소유하고 있는 동안 recursive_mutex를 파괴하면 프로그램의 동작은 정의되지 않아요. recursive_mutex 클래스는 Mutex 및 StandardLayoutType의 모든 요구 사항을 충족해요.
멤버 타입
| 멤버 타입 | 정의 |
|---|---|
native_handle_type (선택*) |
구현에서 정의됨 |
멤버 함수
| 멤버 함수 | 설명 |
|---|---|
| (constructor) | 뮤텍스를 생성해요 (공개 멤버 함수) |
| (destructor) | 뮤텍스를 파괴해요 (공개 멤버 함수) |
operator= [deleted] |
복사 대입이 불가능해요 (공개 멤버 함수) |
| Locking | |
lock |
뮤텍스를 잠가요. 뮤텍스를 사용할 수 없으면 블록돼요 (공개 멤버 함수) |
try_lock |
뮤텍스 잠금을 시도해요. 뮤텍스를 사용할 수 없으면 반환돼요 (공개 멤버 함수) |
unlock |
뮤텍스의 잠금을 해제해요 (공개 멤버 함수) |
| Native handle | |
native_handle |
구현에서 정의된 네이티브 핸들 객체를 반환해요 (공개 멤버 함수) |
예제
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
같이 보기
| mutex (C++11) | 기본 상호 배제 기능을 제공해요 (클래스) |