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 を所有している場合、他のすべてのスレッドは( lock の呼び出しに対して)ブロックされるか、または( try_lock に対して) false の戻り値を受け取ります( recursive_mutex の所有権を要求しようとした場合)。
  • recursive_mutex がロック可能な最大回数は未規定ですが、その回数に達した後は、 lock の呼び出しは std::system_error をスローし、 try_lock の呼び出しは false を返します。

スレッドによって所有されている状態で recursive_mutex が破棄された場合、プログラムの動作は未定義です。 recursive_mutex クラスは Mutex および StandardLayoutType のすべての要件を満たします。

目次

メンバー型

メンバー型 定義
native_handle_type ( オプション* ) 実装定義

メンバー関数

ミューテックスを構築する
(public member function)
ミューテックスを破棄する
(public member function)
operator=
[deleted]
コピー代入不可
(public member function)
ロック操作
ミューテックスをロックする。利用できない場合はブロックする
(public member function)
ミューテックスのロックを試みる。利用できない場合は即座に返る
(public member function)
ミューテックスをアンロックする
(public member function)
ネイティブハンドル
基盤となる実装定義のネイティブハンドルオブジェクトを返す
(public member function)

recursive_mutex の使用例の1つは、メンバー関数が互いに呼び出し合う可能性があるクラス内の共有状態を保護することです。

#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)