共用方式為


_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年.人所有之商標。 重製與收益進階微裝置,及來自的使用權限.

請參閱

參考

編譯器內建

_InterlockedCompareExchange 內建函式

與 x86 編譯器衝突