std::mutex
來自 cppreference.com
定義於標頭檔案 <mutex> |
||
class mutex; |
(C++11 起) | |
mutex
類是一個同步原語,可用於保護共享資料免遭多個執行緒同時訪問。
mutex
提供排他、非遞迴的所有權語義。
- 呼叫執行緒從成功呼叫
lock
或try_lock
到呼叫unlock
之間,都“擁有”一個mutex
。 - 當一個執行緒擁有一個
mutex
時,所有其他執行緒在嘗試獲取mutex
的所有權時,將阻塞(對於呼叫lock
)或收到 false 返回值(對於try_lock
)。 - 呼叫執行緒在呼叫
lock
或try_lock
之前不得擁有mutex
。
如果在任何執行緒仍擁有 mutex
的情況下銷燬 mutex
,或者線上程擁有 mutex
的情況下終止執行緒,則程式的行為是未定義的。 mutex
類滿足 Mutex 和 StandardLayoutType 的所有要求。
std::mutex
既不可複製也不可移動。
目錄 |
[編輯] 巢狀型別
名稱 | 定義 |
native_handle_type (可選*) |
實現定義 |
[編輯] 成員函式
構造互斥體 (public 成員函式) | |
銷燬互斥體 (public 成員函式) | |
operator= [已刪除] |
不可複製賦值 (public 成員函式) |
加鎖 | |
鎖定互斥體,如果互斥體不可用則阻塞 (public 成員函式) | |
嘗試鎖定互斥體,如果互斥體不可用則返回 (public 成員函式) | |
解鎖互斥體 (public 成員函式) | |
原生控制代碼 | |
返回底層實現定義的原生控制代碼物件 (public 成員函式) |
[編輯] 注意
std::mutex
通常不直接訪問:std::unique_lock、std::lock_guard 或 std::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
[編輯] 參閱
(C++11) |
提供互斥設施,可以被同一執行緒遞迴鎖定 (類) |
(C++11) |
實現嚴格基於作用域的互斥體所有權包裝器 (類模板) |
(C++11) |
實現可移動的互斥體所有權包裝器 (類模板) |
(C++17) |
用於多個互斥體的死鎖避免 RAII 包裝器 (類模板) |
(C++11) |
提供與 std::unique_lock 關聯的條件變數 (類) |