解鎖一個沒有被鎖定的std::mutex是非法的。為什么會這樣呢?為什么它不只是沒有影響,因為該突變體還沒有被鎖定,或者已經被解鎖了,那么再次呼叫解鎖有什么壞處呢?
uj5u.com熱心網友回復:
解鎖沒有被鎖定的std::mutex是UB。為什么會這樣呢?為什么不是沒有效果,因為mutex還沒有被鎖定,或者已經被解鎖了,那么再次呼叫解鎖有什么壞處呢?
因為這將會有一個代價。這將要求每個實作包含必要的內部檢查以確保這一行為。
如果您想要一個具有這種行為的互斥器,您可以編碼一個。但是,你將不得不支付額外的檢查費用來實作這一目標。但是那些不需要這種行為的人就不會支付這些費用。
這些成本往往會比你想象的要高。擁有一個突變器使得訪問受該突變器保護的一切都很安全。如果你不擁有一個突變體,那么訪問受該突變體保護的事物就不安全了。因此,在某些實作中,這可能需要在釋放互斥體之前獲得一個互斥體(以便你可以安全地訪問互斥體的所有權資料)。如果獲取和釋放互斥的成本相當,那么這可能是解鎖互斥成本的兩倍。呸!
。uj5u.com熱心網友回復:
這是歷史性的。
從semaphores實作一個mutex是可能的。在這個實作中,解鎖會增加一個計數,鎖定會測驗它是否為零,然后減去它。(如果沒記錯的話,你需要另一個信號器來鎖定 "測驗 "部分--但在這個問題上我將忽略這一點)。) mutex的唯一有效值是0(鎖定)或1(解鎖)。
通過鎖定一個已經鎖定的mutex,或者通過解鎖一個未鎖定的mutex,你可以把這個值趕出0-1的范圍,使mutex不再正確執行。
這是U/B,因為有可能制造不受這個問題影響的突變體,但不是每個系統都能獲得這種解決方案,所以如果你想要可移植的C 代碼,你必須有一個簡單的計數增量/減量的心理模型,并且只鎖定那些或未鎖定的突變體。只有被鎖定的突變體才能被解鎖。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/314145.html
標籤:
