讀取器/寫入器 (SRW) 鎖定

讀取器/寫入器 (SRW) 鎖定可讓單一進程的執行緒存取共用資源;它們已針對速度進行優化,而且佔用非常少的記憶體。 無法跨進程共用讀取器寫入器鎖定。

讀取器執行緒會從共用資源讀取資料,而寫入器執行緒會將資料寫入共用資源。 當多個執行緒使用共用資源讀取和寫入時,如果讀取器執行緒持續執行但寫入作業很少,獨佔鎖定,例如重要區段或 Mutex,可能會成為瓶頸。

SRW 鎖定提供兩種模式,讓執行緒可以存取共用資源:

  • 共用模式,授與多個讀取器執行緒的共用唯讀存取權,讓它們能夠同時從共用資源讀取資料。 如果讀取作業超過寫入作業,則相較于重要區段,此並行會增加效能和輸送量。

    注意

    共用模式 SRW 鎖定不應以遞迴方式取得,因為這可能會在與獨佔取得結合時導致死結。

  • 獨佔模式,一次授與一個寫入器執行緒的讀取/寫入存取權。 當鎖定以獨佔模式取得時,其他執行緒都無法存取共用資源,直到寫入器釋放鎖定為止。

    注意

    獨佔模式 SRW 鎖定無法以遞迴方式取得。 如果執行緒嘗試取得已保留的鎖定,該嘗試將會失敗 (TryAcquireSRWLockExclusive) 或 AcquireSRWLockExclusive ()

單一 SRW 鎖定可以在任一模式中取得;讀取器執行緒可以在共用模式中取得它,而寫入器執行緒可以在獨佔模式中取得它。 不保證要求擁有權的執行緒將獲授與擁有權的順序;SRW 鎖定不是公平也不是 FIFO。

SRW 鎖定是指標的大小。 優點是更新鎖定狀態的速度很快。 缺點是可以儲存非常少的狀態資訊,因此 SRW 鎖定不會偵測到共用模式中不正確的遞迴使用。 此外,在共用模式中擁有 SRW 鎖定的執行緒無法將其鎖定擁有權升級為獨佔模式。

呼叫端必須配置 SRWLOCK 結構,並藉由呼叫 InitializeSRWLock (來動態初始化結構) 或將常數 SRWLOCK_INIT 指派給結構變數, (以靜態方式初始化結構) 。

您可以使用 應用程式驗證器 來尋找遞迴 (重新進入) SRW 鎖定的使用。

以下是 SRW 鎖定函式。

SRW 鎖定函式 Description
AcquireSRWLockExclusive 取得獨佔模式的 SRW 鎖定。
AcquireSRWLockShared 取得共用模式中的 SRW 鎖定。
InitializeSRWLock 初始化 SRW 鎖定。
ReleaseSRWLockExclusive 釋放以獨佔模式開啟的 SRW 鎖定。
ReleaseSRWLockShared 釋放以共用模式開啟的 SRW 鎖定。
SleepConditionVariableSRW 在指定的條件變數上睡眠,並將指定的鎖定釋放為不可部分完成的作業。
TryAcquireSRWLockExclusive 嘗試以獨佔模式取得精簡讀取器/寫入器 (SRW) 鎖定。 如果呼叫成功,呼叫執行緒會取得鎖定的擁有權。
TryAcquireSRWLockShared 嘗試在共用模式中取得精簡讀取器/寫入器 (SRW) 鎖定。 如果呼叫成功,呼叫執行緒會取得鎖定的擁有權。