C++ 命名要求: 互斥體 (Mutex) (C++11 起)
來自 cppreference.com
互斥體 (Mutex) 要求擴充套件了 可鎖定物件 (Lockable) 要求,以包含執行緒間同步。
目錄 |
[編輯] 要求
對於 互斥體 (Mutex) 型別的物件 m
- 表示式 m.lock() 具有以下屬性
- 行為類似於原子操作。
- 阻塞呼叫執行緒,直到可以獲得互斥體的獨佔所有權。
- 對同一互斥體的先前 m.unlock() 操作與此鎖定操作同步 (synchronize-with)(等同於釋放-獲取 std::memory_order)。
- 如果呼叫執行緒已擁有互斥體,則行為未定義(除非 m 是 std::recursive_mutex 或 std::recursive_timed_mutex)。
- 錯誤時可能丟擲 std::system_error 型別的異常,錯誤程式碼如下
- 如果呼叫執行緒沒有所需許可權,則為 std::errc::operation_not_permitted。
- 如果實現檢測到此操作將導致死鎖,則為 std::errc::resource_deadlock_would_occur。
- 表示式 m.try_lock() 具有以下屬性
- 行為類似於原子操作。
- 嘗試為呼叫執行緒獲取互斥體的獨佔所有權而不阻塞。如果未獲得所有權,則立即返回。即使互斥體當前未被其他執行緒擁有,該函式也允許虛假失敗並返回。
- 如果
try_lock()成功,則對同一物件的先前unlock()操作與此操作同步 (synchronize-with)(等同於釋放-獲取 std::memory_order)。lock()不與失敗的try_lock()同步。 - 不丟擲異常。
- 表示式 m.unlock() 具有以下屬性
- 行為類似於原子操作。
- 釋放呼叫執行緒對互斥體的所有權,並與對同一物件的後續成功鎖定操作同步 (synchronizes-with)。
- 如果呼叫執行緒不擁有互斥體,則行為未定義。
- 不丟擲異常。
- 單個互斥體上的所有鎖定和解鎖操作都以單個總順序發生,可以看作是原子變數的修改順序:該順序特定於此單個互斥體。
[編輯] 標準庫
以下標準庫型別滿足 互斥體 (Mutex) 要求
| (C++11) |
提供基本的互斥設施 (類) |
| (C++11) |
提供互斥設施,可以被同一執行緒遞迴鎖定 (類) |
| 提供互斥設施,可以被遞迴鎖定 被同一執行緒鎖定並實現帶超時的鎖定 (類) | |
| (C++17) |
提供共享互斥設施 (類) |
| (C++14) |
提供共享互斥設施,並實現帶超時鎖 (類) |
| (C++11) |
提供互斥設施,實現帶超時的鎖定 (類) |
[編輯] 缺陷報告
下列更改行為的缺陷報告追溯地應用於以前出版的 C++ 標準。
| 缺陷報告 | 應用於 | 釋出時的行為 | 正確的行為 |
|---|---|---|---|
| LWG 2309 | C++11 | lock 可能會丟擲 std::system_error錯誤程式碼為 std::errc::device_or_resource_busy |
不允許 |