的std::mutex::lock()
構件功能不被聲明爲noexcept
和從部分30.4.1.2互斥類型C++ 11標準的(草案n3337),第6:
表達m.lock()
應很好-formed並具有以下語義:
- ...
- 拋出:
system_error
當需要異常(30.2.2)。
- 錯誤條件:
operation_not_permitted
- 如果線程沒有權限執行操作。
resource_deadlock_would_occur
- 如果實現檢測到會發生死鎖。
device_or_resource_busy
- 如果互斥鎖已經被鎖定並且阻塞是不可能的。
這意味着使用任何mutex::lock()
功能不能標記noexcept
,除非該功能能夠處理該異常本身並防止其propogating給調用者。
我無法對這些錯誤情況發生的歷史的可能性發表評論,但相對於std::mutex
和resource_deadlock_would_occur
(其中可能拋出)表示在代碼中的錯誤,而不是運行時出現故障因爲如果線程試圖鎖定它已經擁有的std::mutex
,則可能會引發此錯誤。從部分30.4.1.2.1類互斥,第4條:
[注:如果擁有一個互斥對象的線程調用鎖()該對象上的程序可以死鎖。如果實現可以檢測到死鎖,則可能會觀察到resource_deadlock_would_occur錯誤情況。末端注]
通過選擇std::mutex
爲鎖定類型的程序員,明確指出同一線程試圖鎖定mutex
它已經被鎖定是不可能的。 它是一個線程執行的合法路徑重新鎖定mutex
然後std:recursive_mutex
是更合適的選擇(但更改爲recursive_lock
並不意味着lock()
函數是免費例外)。
+1鎖定可能拋出真的不是一件好事恕我直言,當然我們需要在析構函數中調用它們,最後我寫了[自己的互斥類](http://stackoverflow.com/questions/16568990/locking-a-mutex-in- a-destructor-in-c11/16597680#16597680) – Arnaud