_InterlockedCompareExchange128
Microsoft 專有的
執行 128 位元的連鎖的比較和交換。
unsigned char _InterlockedCompareExchange128(
__int64 volatile * Destination,
__int64 ExchangeHigh,
__int64 ExchangeLow,
__int64 * ComparandResult
);
參數
輸入 [、 輸出]Destination
為 128 位元欄位會被視為目的地,因為這是兩個 64 位元整數的陣列的指標。 目的資料必須是 16 位元組對齊,以避免一般保護性錯誤。[in] ExchangeHigh
64 位元的整數可以交換高可為目的端。[in] ExchangeLow
可能會與低部份目的地交換為 64 位元整數。輸入 [、 輸出]ComparandResult
指標 (128 位元欄位被視為) 的兩個 64 位元整數的陣列,要與目的地進行比較。 在輸出時,這會覆寫目的端的原始值。
傳回值
1 如果 128 位元 comparand 等於目的端的原始值。 ExchangeHigh與ExchangeLow覆寫 128 位元的目的地。
假如 comparand 未到達目的端的原始值 0。 目的端的值是不變,comparand 的值就會覆寫目的端的值。
需求
內建 |
架構 |
---|---|
_InterlockedCompareExchange128 |
x64 |
標頭檔 <intrin.h>
備註
此內建會產生 cmpxchg16b指令 (與lock前置詞) 進行 128 位元鎖定的比較和交換。 早期版本的 「 AMD 64 位元硬體不支援這個指令。 若要檢查是否有硬體支援cmpxchg16b 指令,請打**__cpuid**與內建InfoType=0x00000001 (standard function 1)。 位元 13 的CPUInfo[2] (ECX) 為 1,如果指令受支援。
注意事項 |
---|
值為ComparandResult一定會覆寫。後lock指令時,此內建會立即將複製的初始值Destination到ComparandResult。基於這個理由, ComparandResult和Destination應該指向不同的記憶體位置,以避免無法預期的行為。 |
雖然您可以使用**_InterlockedCompareExchange128低層級的執行緒同步處理,您不需要同步處理超過 128 位元,如果您可以使用較小的同步處理函式 (例如另_InterlockedCompareExchange內建函式) 相反。 使用_InterlockedCompareExchange128**如果您想要在記憶體中為 128 位元值不可部分完成的存取。
如果您執行的程式碼會使用此內建不支援的硬體上cmpxchg16b指令時,結果會發生無法預期。
使用僅當做內建這個常式。
範例
這個範例會使用**_InterlockedCompareExchange128**高兩個 64 位元整數的陣列中的文字取代它的高、 低字組的總和,並以逐步遞增低位文字。 BigInt.Int 陣列存取是不可部分完成,但本範例使用單一執行緒,並會略過鎖定為了簡單起見。
// cmpxchg16b.c
// processor: x64
// compile with: /EHsc /O2
#include <stdio.h>
#include <intrin.h>
typedef struct _LARGE_INTEGER_128 {
__int64 Int[2];
} LARGE_INTEGER_128, *PLARGE_INTEGER_128;
volatile LARGE_INTEGER_128 BigInt;
// This AtomicOp() function atomically performs:
// BigInt.Int[1] += BigInt.Int[0]
// BigInt.Int[0] += 1
void AtomicOp ()
{
LARGE_INTEGER_128 Comparand;
Comparand.Int[0] = BigInt.Int[0];
Comparand.Int[1] = BigInt.Int[1];
do {
; // nothing
} while (_InterlockedCompareExchange128(BigInt.Int,
Comparand.Int[0] + Comparand.Int[1],
Comparand.Int[0] + 1,
Comparand.Int) == 0);
}
// In a real application, several threads contend for the value
// of BigInt.
// Here we focus on the compare and exchange for simplicity.
int main(void)
{
BigInt.Int[1] = 23;
BigInt.Int[0] = 11;
AtomicOp();
printf("BigInt.Int[1] = %d, BigInt.Int[0] = %d\n",
BigInt.Int[1],BigInt.Int[0]);
}
結束 Microsoft 特定
藉由收益進階微裝置,及版權 2007年.人所有之商標。 重製與收益進階微裝置,及來自的使用權限.