名稱空間
變體
操作

std::recursive_mutex

來自 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)
期值
(C++11)
(C++11)
(C++11)
(C++11)
安全回收
(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 提供獨佔的、遞迴的所有權語義。

  • 呼叫執行緒透過成功呼叫 locktry_lock 來獲得 recursive_mutex 的所有權,並在之後的一段時間內保持該所有權。在此期間,該執行緒可以額外呼叫 locktry_lock。當執行緒呼叫匹配次數的 unlock 時,所有權期結束。
  • 當一個執行緒擁有一個 recursive_mutex 時,所有其他執行緒如果嘗試獲取 recursive_mutex 的所有權,將會被阻塞(對於 lock 呼叫)或收到 false 返回值(對於 try_lock)。
  • 一個 recursive_mutex 可以被鎖定的最大次數是未指定的,但達到該次數後,呼叫 lock 將丟擲 std::system_error,而呼叫 try_lock 將返回 false

如果一個 recursive_mutex 在仍被某個執行緒擁有時被銷燬,則程式的行為是未定義的。recursive_mutex 類滿足 MutexStandardLayoutType 的所有要求。

目錄

[編輯] 成員型別

成員型別 定義
native_handle_type (可選*) 實現定義的[編輯]

[編輯] 成員函式

構造互斥體
(public 成員函式) [編輯]
銷燬互斥體
(public 成員函式) [編輯]
operator=
[已刪除]
不可複製賦值
(public 成員函式) [編輯]
加鎖
鎖定互斥體,如果互斥體不可用則阻塞
(public 成員函式) [編輯]
嘗試鎖定互斥體,如果互斥體不可用則返回
(public 成員函式) [編輯]
解鎖互斥體
(public 成員函式) [編輯]
原生控制代碼
返回底層實現定義的原生控制代碼物件
(public 成員函式) [編輯]

[編輯] 示例

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)
提供基本的互斥設施
(類) [編輯]