Loading AI tools
来自维基百科,自由的百科全书
讀寫鎖是計算機程序的並發控制的一種同步機制,也稱「共享-互斥鎖」、多讀者-單寫者鎖。[1]多讀者鎖,[2],「push lock」[3]) 用於解決讀寫問題。讀操作可並發重入,寫操作是互斥的。這意味着多個線程可以同時讀數據,但寫數據時需要獲得一個獨占的鎖。當寫者寫數據時,其它寫者或讀者需要等待,直到這個寫者完成寫操作。讀寫鎖常見的用法是控制線程對內存中的某種數據結構的訪問,這種數據結構不能被原子性地更新,並且在完成更新之前都是無效的。
此條目需要精通或熟悉相關主題的編者參與及協助編輯。 (2017年11月22日) |
某些讀寫鎖允許在讀模式與寫模式之間升降級。[1]
讀寫鎖可以有不同的操作模式優先級:
Michel Raynal使用兩把互斥鎖與一個整數計數器實現。計數器b跟蹤被阻塞的讀線程。互斥鎖r保護b,供讀者使用。互斥鎖g (指"global")確保寫操作互斥。偽代碼:
Begin Read
End Read
Begin Write
End Write
實現是讀操作優先。[6]:76
可使用條件變量c與普通的互斥鎖m、整型計數器r(表示正在讀的個數)與布爾標誌w(表示正在寫)來實現讀寫鎖。
lock-for-read與lock-for-write各自有自己的逆操作。unlock-for-read通過減量r並在r變為0時通知c。unlock-for-write設置w為false並通知c。[7][8][9]
pthread_rwlock_t
與相關操作[10]System.Threading.ReaderWriterLockSlim
鎖,用於C#與.NET語言程序[12]std::shared_mutex
read/write鎖在C++17[13]boost::shared_mutex
與boost::upgrade_mutex
鎖在Boost C++ Libraries[14]sync.RWMutex
在Go語言[15]std::sync::RwLock
,在Rust語言[17]mse::recursive_shared_timed_mutex
在SaferCPlusPlus庫,是支持std::recursive_mutex
(頁面存檔備份,存於網際網路檔案館)的recursive ownership語義的std::shared_timed_mutex
(頁面存檔備份,存於網際網路檔案館)的一個實現txrwlock.ReadersWriterDeferredLock
,用於Twisted[18]SRWLock
,見Windows操作系統API,從Windows Vista開始.[19]
讀寫鎖(Slim reader/writer,SRW, lock)用於進程內的線程間同步。 SRW既不是公平的也不是先進先出的。讀寫鎖數據結構的內部實現就是一個指針。讀寫鎖的性能較臨界區有很大的提升,這是因為讀寫鎖是基於原子操作,關鍵段是基於event內核對象的,從用戶模式到內核模式的切換占用了大量的時鐘周期。相關API:[20]
read-copy-update (RCU)算法是讀寫鎖的一種替代實現。RCU對讀操作是無等待。Linux內核實現了很少寫操作的一種RCU叫做seqlock。
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.