名前空間
変種
操作

std::recursive_mutex

From cppreference.com
< cpp‎ | thread
 
 
並行性サポートライブラリ
スレッド
(C++11)
(C++20)
this_thread 名前空間
(C++11)
(C++11)
(C++11)
協調的なキャンセル
排他制御
(C++11)
recursive_mutex
(C++11)
汎用ロック管理
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
条件変数
(C++11)
セマフォ
ラッチとバリア
(C++20)
(C++20)
future
(C++11)
(C++11)
(C++11)
(C++11)
安全なメモリ解放 (Safe Reclamation)
(C++26)
ハザードポインタ
アトミック型
(C++11)
(C++20)
アトミック型の初期化
(C++11)(C++20で非推奨)
(C++11)(C++20で非推奨)
メモリオーダー
(C++11)(C++26で非推奨)
アトミック操作のためのフリー関数
アトミックフラグのためのフリー関数
 
 
ヘッダ <mutex> で定義
class recursive_mutex;
(C++11以降)

recursive_mutexクラスは、共有データが複数のスレッドから同時にアクセスされるのを防ぐために使用できる同期プリミティブです。

recursive_mutexは、排他的な再帰的所有権セマンティクスを提供します。

  • 呼び出し元のスレッドは、lockまたはtry_lockのいずれかを正常に呼び出した時点から始まる期間、recursive_mutexを*所有*します。この期間中、スレッドはlockまたはtry_lockを追加で呼び出すことができます。所有期間は、スレッドがunlockを対応する回数だけ呼び出したときに終了します。
  • スレッドがrecursive_mutexを所有している間、他のすべてのスレッドは、recursive_mutexの所有権を主張しようとするとブロックされます(lockの呼び出しの場合)か、`false`の戻り値を受け取ります(try_lockの場合)。
  • recursive_mutexがロックできる最大回数は未定義ですが、その回数に達した後、lockの呼び出しはstd::system_errorをスローし、try_lockの呼び出しは`false`を返します。

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

目次

[編集] メンバ型

メンバ型 定義
native_handle_type (任意*) 実装定義[編集]

[編集] メンバ関数

ミューテックスを構築します
(public メンバ関数) [編集]
ミューテックスを破棄します
(public メンバ関数) [編集]
operator=
[削除]
コピー代入不可
(public メンバ関数) [編集]
ロック
ミューテックスをロックします。ミューテックスが利用できない場合はブロックします
(public メンバ関数) [編集]
ミューテックスをロックしようとします。ミューテックスが利用できない場合は戻ります
(public メンバ関数) [編集]
ミューテックスをアンロックします
(public メンバ関数) [編集]
ネイティブハンドル
基になる実装定義のネイティブハンドルオブジェクトを返します
(public メンバー関数) [編集]

[編集]

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)
基本的な相互排他機能を提供する
(クラス) [編集]
English 日本語 中文(简体) 中文(繁體)