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) | 기본 상호 배제 기능을 제공해요 (클래스) |

더 알아보기 (Learn more)

cppreference