Namespaces
Variants

std:: recursive_mutex

From cppreference.net
Concurrency support library
Threads
(C++11)
(C++20)
this_thread namespace
(C++11)
(C++11)
Cooperative cancellation
Mutual exclusion
(C++11)
recursive_mutex
(C++11)
Generic lock management
Condition variables
(C++11)
Semaphores
Latches and Barriers
(C++20)
(C++20)
Futures
(C++11)
(C++11)
(C++11)
Safe reclamation
Hazard pointers
Atomic types
(C++11)
(C++20)
Initialization of atomic types
(C++11) (deprecated in C++20)
(C++11) (deprecated in C++20)
Memory ordering
(C++11) (deprecated in C++26)
Free functions for atomic operations
Free functions for atomic flags
헤더 파일에 정의됨 <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)