我在我的程序中遇到了死鎖問題。所以我一直在閱讀關於鎖的問題,但問題是大多數信息不一致或者沒有定義平臺。在Recursive Lock (Mutex) vs Non-Recursive Lock (Mutex)最接受的回答說:遞歸和非遞歸鎖(互斥鎖)
由於遞歸互斥有主人翁意識,在線程 抓住互斥必須是釋放互斥鎖在同一個線程。在 非遞歸互斥體的情況下,沒有所有權意識,任何線程通常都可以釋放該互斥體,無論哪個線程本來是 接受互斥體。在許多情況下,這種類型的「互斥體」實際上更多的是信號量動作,在這種情況下,您不一定要使用互斥體作爲排斥設備,而是將其用作兩個或更多線程之間的同步或信號設備 。
在評論中,人們說這是不正確的,沒有提及它。所以...
1)如果我在線程A中鎖定了一個非遞歸互斥鎖,線程B可以解鎖它而無需獲取鎖?
2)如果線程A在一個非遞歸互斥體中進行了鎖定,並且線程B調用了鎖定,那麼線程B是否等待,直到鎖定被釋放以獲得鎖定或將拋出一個異常?這個遞歸互斥體的情況呢? (也可以在其他問題中進行討論,其中沒有可以作出的正確結論)
3)當使用遞歸鎖時,在進程終止時,是否必須釋放所有遞歸鎖? (取決於過程結束的地方沒有發生)
4)當謹慎使用遞歸和非遞歸鎖的組合時,我會注意哪些問題?
PS:只使用windows平臺和std::thread
。
_The接受的答案是錯誤的,或者至少是非常說明其一點,「鎖定互斥體可能比它與非遞歸互斥種所有者以外的其他線程來解鎖」非常poorly._它似乎你現在接受的答案可能會使用警衛。 – bvj 2017-12-27 02:13:46