讀取器/寫入器 (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) 鎖定。 如果呼叫成功,呼叫執行緒會取得鎖定的擁有權。 |