讀寫鎖

来自维基百科,自由的百科全书

讀寫鎖是電腦程式的並發控制的一種同步機制,也稱「共享-互斥鎖」、多讀者-單寫者鎖。[1]多讀者鎖[2],「push lock」[3]) 用於解決讀寫問題英語readers–writers problem。讀操作可並發重入,寫操作是互斥的。這意味著多個執行緒可以同時讀數據,但寫數據時需要獲得一個獨占的鎖。當寫者寫數據時,其它寫者或讀者需要等待,直到這個寫者完成寫操作。讀寫鎖常見的用法是控制執行緒對內存中的某種資料結構的訪問,這種資料結構不能被原子性地更新,並且在完成更新之前都是無效的。

讀寫鎖通常用互斥鎖條件變量信號量實現。

某些讀寫鎖允許在讀模式與寫模式之間升降級。[1]

優先級策略

讀寫鎖可以有不同的操作模式優先級:

  • 讀操作優先鎖:提供了最大並發性,但在鎖競爭比較激烈的情況下,可能會導致寫操作飢餓。這是由於只要還有一個讀執行緒持鎖,寫執行緒就拿不到鎖。多個讀者可以立刻拿到鎖,這意味著一個寫者可能一直在等鎖,期間新的讀者一直可以拿到鎖。極端情況下,寫者執行緒可能會一直等鎖,直到所有一開始就拿到鎖的讀者釋放鎖。讀者的可以是弱優先級的,如前文所述,也可以是強優先級的,即只要寫者釋放鎖,任何等待的讀者總能先拿到。
  • 寫操作優先鎖:如果隊列中有寫者在等鎖,則阻止任何讀者拿鎖,來避免了寫操作飢餓的問題。一旦所有已經開始的讀操作完成,等待的寫操作立即獲得鎖。[4]和讀操作優先鎖相比,寫操作優先鎖的不足在於在寫者存在的情況下並發度低。內部實現需要兩把互斥鎖。[5]
  • 未指定優先級鎖:不提供任何讀/寫的優先級保證。

實現

使用兩把互斥鎖

Michel Raynal英語Michel Raynal使用兩把互斥鎖與一個整數計數器實現。計數器b跟蹤被阻塞的讀執行緒。互斥鎖r保護b,供讀者使用。互斥鎖g (指"global")確保寫操作互斥。偽代碼:

Begin Read

  • Lock r.
  • Increment b.
  • If b = 1, lock g.
  • Unlock r.

End Read

  • Lock r.
  • Decrement b.
  • If b = 0, unlock g.
  • Unlock r.

Begin Write

  • Lock g.

End Write

  • Unlock g.

實現是讀操作優先。[6]:76

使用條件變量與互斥鎖

可使用條件變量c與普通的互斥鎖m、整型計數器r(表示正在讀的個數)與布爾標誌w(表示正在寫)來實現讀寫鎖。

lock-for-read操作:[7][8][9]

  • Lock m (blocking).
  • While w:
  • Increment r.
  • Unlock m.

lock-for-write操作:[7][8][9]

  • Lock m (blocking).
  • While (w or r > 0):
    • wait c, m
  • Set w to true.
  • Unlock m.

lock-for-read與lock-for-write各自有自己的逆操作。unlock-for-read通過減量r並在r變為0時通知c。unlock-for-write設置w為false並通知c[7][8][9]

程序語言支持

Windows作業系統

SRWLock,見Windows作業系統API,從Windows Vista開始.[19]

讀寫鎖(Slim reader/writer,SRW, lock)用於進程內的執行緒間同步。 SRW既不是公平的也不是先進先出的。讀寫鎖資料結構的內部實現就是一個指針。讀寫鎖的性能較臨界區有很大的提升,這是因為讀寫鎖是基於原子操作,關鍵段是基於event內核對象的,從用戶模式到內核模式的切換占用了大量的時鐘周期。相關API:[20]

  • InitializeSRWLock:動態初始化SRW結構。也可以直接賦值SRWLOCK_INIT常量來靜態初始化SRW結構。不需要顯式析構。
  • AcquireSRWLockShared:獲取共享讀的SRW鎖。
  • AcquireSRWLockExclusive:獲取專享寫的SRW鎖。
  • TryAcquireSRWLockShared:試圖獲取共享讀的SRW鎖。
  • TryAcquireSRWLockExclusive:試圖獲取專享寫的SRW鎖。
  • ReleaseSRWLockShared:釋放已經獲取的共享讀的SRW鎖。
  • ReleaseSRWLockExclusive:釋放已經獲取的專享寫的SRW鎖。
  • SleepConditionVariableSRW:在已經獲取SRW鎖的前提下,原子操作:在指定條件變量上睡眠並釋放SRW鎖

可選

read-copy-update (RCU)算法是讀寫鎖的一種替代實現。RCU對讀操作是無等待。Linux內核實現了很少寫操作的一種RCU叫做seqlock

參見

注釋

參考文獻

Loading related searches...

Wikiwand - on

Seamless Wikipedia browsing. On steroids.