recursive_mutex — std::recursive_mutex
recursive_mutex — std::recursive_mutex
std::recursive_mutex 클래스는 여러 스레드가 동시에 공유 데이터에 접근하는 것을 막는 데 사용하는 동기화 기본 요소예요. C++11에서 도입됐어요. <mutex> 헤더에 있어요.
recursive_mutex는 전용, 재귀(recursive) 소유권 의미론을 제공해요.
출처: cppreference
본문
// <mutex> 헤더, C++11
class recursive_mutex;
recursive_mutex는 호출 스레드가 성공적으로 lock()을 호출한 순간부터 그 시점까지 뮤텍스를 소유해요.
재귀 잠금 허용
std::mutex와 달리, 이미 소유한 스레드가 다시 lock()해도 데드락이 나지 않아요. 잠금 횟수가 카운트되고, 그만큼 unlock()해야 완전히 해제돼요.
#include <mutex>
std::recursive_mutex m;
void recurse(int depth) {
std::lock_guard<std::recursive_mutex> lk(m); // 재귀적 잠금 허용
if (depth > 0) recurse(depth - 1); // 같은 스레드 → 재잠금
}
주요 연산
| 연산 | 설명 |
|---|---|
lock() |
잠금 (재귀 허용) |
try_lock() |
즉시 시도 |
unlock() |
잠금 해제 (최대 깊이만큼) |
지정되지 않은 소유권
lock()이 재귀적으로 몇 번 호출됐는지는 지정되지 않아요. lock()을 N번 호출했으면 unlock()도 N번 호출해야 완전히 해제돼요.
주의
- 재귀 뮤텍스는 같은 스레드 내 재진입을 허용하지만, 이로 인해 약간의 오버헤드가 있어요.
- 재귀가 필요 없으면
std::mutex가 더 효율적이에요. - 재귀 잠금은 다른 스레드에게는 여전히 배타적이에요.
std::recursive_mutex는 재귀 함수·콜백 등에서 같은 스레드가 여러 번 잠글 필요가 있을 때 유용해요. 대부분의 경우 단순한 std::mutex로 충분해요.