Interlocked Variable Access
應用程式必須同步存取多個線程共用的變數。 應用程式也必須確保這些變數上的作業會以不可部分完成的方式執行(完全完全執行。
正確對齊 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。 取得記憶體語意,指定在嘗試任何其他記憶體作業之前,將會顯示目前線程所執行的記憶體作業。 釋放記憶體語意指定目前線程所執行的記憶體作業將在所有其他記憶體作業完成之後顯示。 這些語意可讓您強制以特定順序執行記憶體作業。 在進入受保護的區域時使用取得語意,並在離開時釋放語意。
相關主題