相互鎖定的變數存取
應用程式必須同步存取多個執行緒共用的變數。 應用程式也必須確保這些變數上的作業會以不可部分完成的方式執行, (完全執行。)
正確對齊 32 位變數的簡單讀取和寫入是不可部分完成的作業。 換句話說,您最後不會更新變數的一部分;所有位都會以不可部分完成的方式更新。 不過,不保證要同步存取。 如果兩個執行緒是從相同的變數讀取和寫入,則您無法判斷某個執行緒是否會在另一個執行緒執行寫入作業之前執行其讀取作業。
對正確對齊 64 位變數的簡單讀取和寫入,在 64 位 Windows 上不可部分完成。 讀取和寫入 64 位值不保證在 32 位 Windows 上不可部分完成。 對於其他大小的變數讀取和寫入,不保證在任何平臺上都是不可部分完成的。
The Interlocked API
連結函式提供簡單的機制,可同步存取多個執行緒所共用的變數。 它們也會以不可部分完成的方式對變數執行作業。 如果變數位於共用記憶體中,則不同進程的執行緒可以使用這些函式。
InterlockedIncrement和InterlockedDecrement函式會將遞增或遞減變數所涉及的步驟結合成不可部分完成的作業。 這項功能在多工作業系統中很有用,其中系統可以中斷某個執行緒的執行,以將處理器時間配量授與另一個執行緒。 如果沒有這類同步處理,兩個執行緒可以讀取相同的值、將它遞增 1,並儲存新值以總計增加 1,而不是 2。 連結的變數存取函式可防範這類錯誤。
InterlockedExchange和InterlockedExchangePointer函式會不可部分地交換指定變數的值。 InterlockedExchangeAdd函式結合了兩個作業:將兩個變數一起新增,並將結果儲存在其中一個變數中。
InterlockedCompareExchange、InterlockedCompare64Exchange128和InterlockedCompareExchangePointer函式結合兩個作業:比較兩個值,並根據比較的結果,將第三個值儲存在其中一個變數中。
InterlockedAnd、InterlockedOr和InterlockedXor函式會分別執行 AND、OR 和 XOR 作業。
有一些函式特別設計用來在 64 位記憶體值和位址上執行相互鎖定的變數存取,並已優化以在 64 位 Windows 上使用。 每個函式都包含名稱中的 「64」 ;例如 ,InterlockedDecrement64 和 InterlockedCompareExchangeAcquire64。
大部分的相互連結函式都會在所有 Windows 平臺上提供完整的記憶體屏障。 另外還有一些函式會結合基本連結變數存取作業,以及特定處理器支援的取得和釋放記憶體排序語意。 每個函式的名稱都包含 「Acquire」 或 「Release」 一詞;例如 ,InterlockedDecrementAcquire 和 InterlockedDecrementRelease。 取得記憶體語意會指定目前線程所執行的記憶體作業會在嘗試任何其他記憶體作業之前顯示。 釋放記憶體語意指定目前線程所執行的記憶體作業會在所有其他記憶體作業完成之後顯示。 這些語意可讓您強制以特定循序執行記憶體作業。 在進入受保護的區域時使用取得語意,並在離開時釋放語意。
相關主題