用mutex實現讀寫鎖,解鎖時候,如何保證和加鎖的時候是同乙個執行緒?

時間 2021-05-30 23:31:24

1樓:優游幻世

雖然我對記憶體模型不是很懂,不過你這個實現100%是錯的,完全沒有考慮到記憶體可見性的問題。讀寫鎖的實現肯定要用到什麼memory barrier很難懂的東西,可以去找找這方面的資料。

好吧……剛去stackoverfow搜了一下,有個用mutex和condition variable實現了讀寫鎖,可以去看看

2樓:靈劍

不不,許多mutex都是不限定加鎖和解鎖為同一執行緒的,這種也稱為不可重入鎖(在同一執行緒加兩次鎖會自己鎖住自己),這裡就是需要這種mutex。必須同一執行緒加鎖解鎖的稱為可重入鎖,檢查執行緒id是為了重入邏輯,它一般是由更基礎的mutex加上執行緒id組成的。

如果語言只提供了可重入鎖,那可能需要使用訊號量、condition之類的更高階的結構來實現讀寫鎖(一般來說並不需要這樣)

修正:這裡說的「不可重入鎖」指的是一種特定的不可重入鎖的實現,它不區分呼叫執行緒。不是所有不可重入的mutex都符合這個描述,比如C++的std::

mutex,按照標準,從其他執行緒unlock是未定義行為(意味著它可能是這裡說的特定實現即允許從其他執行緒unlock,也可能不是,甚至用乙個可重入的鎖來代替也是符合標準的)

32歲負債300萬,想靠閱讀寫作實現逆襲救贖,還有可能麼?

不重則不威 三代已經出了,之前的2代問題很多,主機板燒了的有不少,然後品控也是一言難盡,肩鍵和尾插也有不少人反應容易壞,螢幕很多人翻車,期待三代能把之前的不足完善好,我目前還在觀望,手裡的rog一代打遊戲夠用了,順便問問什麼充電器支援一代27w快充 robin ROG遊戲手機3首發搭載高通驍龍865...

當網路傳輸速度大於硬碟讀寫速度用什麼技術消除瓶頸?

Wind Frank 兩個方面,1.你說的hdd和千兆網都是二十年前的資料中心標配,網路硬體公升級到萬兆乃至雙萬兆的同時,硬碟技術也在發展,你可以去看下ssd的效能資料,尤其是nvme介面的ssd 2.乙個機器上並不永遠只有一張網絡卡和一塊硬碟,資料中心的常見配置應該是雙網絡卡搭多硬碟。多塊硬碟之間...

怎麼用C 實現氣泡排序演算法?

禽獸狼 不用謝 include using namespace std intmain int argc char argv int p Array p asm for auto n Array cout cout return0 已登出 不用謝 不當人大隊3 n include using nam...