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로 충분해요.

더 알아보기 (Learn more)

cppreference