名稱空間
變體
操作

std::mutex

來自 cppreference.com
< cpp‎ | thread
 
 
併發支援庫
執行緒
(C++11)
(C++20)
this_thread 名稱空間
(C++11)
(C++11)
(C++11)
協同取消
互斥
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 mutex;
(C++11 起)

mutex 類是一個同步原語,可用於保護共享資料免遭多個執行緒同時訪問。

mutex 提供排他、非遞迴的所有權語義。

  • 呼叫執行緒從成功呼叫 locktry_lock 到呼叫 unlock 之間,都“擁有”一個 mutex
  • 當一個執行緒擁有一個 mutex 時,所有其他執行緒在嘗試獲取 mutex 的所有權時,將阻塞(對於呼叫 lock)或收到 false 返回值(對於 try_lock)。
  • 呼叫執行緒在呼叫 locktry_lock 之前不得擁有 mutex

如果在任何執行緒仍擁有 mutex 的情況下銷燬 mutex,或者線上程擁有 mutex 的情況下終止執行緒,則程式的行為是未定義的。 mutex 類滿足 MutexStandardLayoutType 的所有要求。

std::mutex 既不可複製也不可移動。

目錄

[編輯] 巢狀型別

名稱 定義
native_handle_type (可選*) 實現定義[編輯]

[編輯] 成員函式

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

[編輯] 注意

std::mutex 通常不直接訪問:std::unique_lockstd::lock_guardstd::scoped_lock(C++17 起) 以更異常安全的方式管理加鎖。

[編輯] 示例

本示例展示瞭如何使用 mutex 來保護在兩個執行緒之間共享的 std::map

#include <chrono>
#include <iostream>
#include <map>
#include <mutex>
#include <string>
#include <thread>
 
std::map<std::string, std::string> g_pages;
std::mutex g_pages_mutex;
 
void save_page(const std::string& url)
{
    // simulate a long page fetch
    std::this_thread::sleep_for(std::chrono::seconds(2));
    std::string result = "fake content";
 
    std::lock_guard<std::mutex> guard(g_pages_mutex);
    g_pages[url] = result;
}
 
int main() 
{
    std::thread t1(save_page, "http://foo");
    std::thread t2(save_page, "http://bar");
    t1.join();
    t2.join();
 
    // safe to access g_pages without lock now, as the threads are joined
    for (const auto& [url, page] : g_pages)
        std::cout << url << " => " << page << '\n';
}

輸出

http://bar => fake content
http://foo => fake content

[編輯] 參閱

提供互斥設施,可以被同一執行緒遞迴鎖定
(類) [編輯]
實現嚴格基於作用域的互斥體所有權包裝器
(類模板) [編輯]
實現可移動的互斥體所有權包裝器
(類模板) [編輯]
用於多個互斥體的死鎖避免 RAII 包裝器
(類模板) [編輯]
提供與 std::unique_lock 關聯的條件變數
(類) [編輯]