共用方式為


苗條讀者/作家 (SRW) 鎖定

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

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

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

  • 共用模式,這會授與多個讀取器線程的共用唯讀存取權,讓共用線程能夠同時讀取共用資源的數據。 如果讀取作業超過寫入作業,此並行存取會比重要區段提高效能和輸送量。

    注意

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

  • 獨佔模式,一次授與一個寫入器線程的讀取/寫入存取權。 當鎖定以獨佔模式取得時,在寫入器釋放鎖定之前,沒有其他線程可以存取共用資源。

    注意

    無法以遞歸方式取得獨佔模式 SRW 鎖定。 如果線程嘗試取得已保留的鎖定,該嘗試將會失敗(針對 tryAcquireSRWLockExclusive) 或死結 (針對 AcquireSRWLockExclusive

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

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

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

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

以下是 SRW 鎖定函式。

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