簡體   English   中英

為什么將 std::mutex 鎖定兩次“未定義行為”?

[英]Why is locking a std::mutex twice 'Undefined Behaviour'?

根據這篇文章

如果您嘗試從同一線程鎖定非遞歸互斥鎖兩次,中間沒有解鎖,則會出現未定義的行為。

我非常天真的頭腦告訴我他們為什么不直接返回錯誤? 這有什么理由必須是UB嗎?

因為它永遠不會在正確的程序中發生,並且對永遠不會發生的事情進行檢查是浪費的(並且要進行檢查需要存儲擁有線程的 ID,這也是浪費)。

請注意,未定義它允許調試實現拋出異常,例如,同時仍然允許發布實現盡可能高效。

未定義的行為允許實現做任何最快/最方便的事情。 例如,非遞歸互斥體的有效實現可能是單個位,其中鎖定操作是通過循環中的原子比較和交換指令實現的。 如果擁有互斥鎖的線程試圖再次鎖定它,它將死鎖,因為它正在等待互斥鎖解鎖,但因為沒有其他人可以解鎖它(除非存在其他一些不擁有它的線程解鎖它的錯誤)線程將永遠等待。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM