2
我在__sync_fetch_and_and
上執行錯誤時出現問題。我寫了下面的代碼來說明吧:__sync_fetch_and_and原子在與Clang的單線程程序中給出錯誤結果
bool equal;
int64_t mask = 0xBEEFDEAD;
int64_t orig = 0xDEADBEEF;
int64_t test1, test2;
test1 = test2 = orig;
equal = (test1 == test2);
printf("Before anding\n");
printf("test1:\t0x%016llX\n", test1);
printf("test2:\t0x%016llX\n", test2);
printf("equal:\t%d\n", equal);
// Try anding
test1 &= mask;
__sync_fetch_and_and(&test2, mask);
equal = (test1 == test2);
printf("After anding\n");
printf("test1:\t0x%016llX\n", test1);
printf("test2:\t0x%016llX\n", test2);
printf("equal:\t%d\n", equal);
的輸出是這樣的:
Before anding
test1: 0xDEADBEEF
test2: 0xDEADBEEF
equal: 1
After anding
test1: 0x0021046700234425
test2: 0xDFAFFFEFBFEFDFEF
equal: 0
...這顯然是不正確的。我試過替換__sync_and_and_fetch
,但那不能解決它。或者`__sync_fetch_and_or`工作正常。我使用Xcode 4.2.1並使用默認編譯器Apple LLVM Compiler 3.0(Clang)進行編譯。當我切換到使用GCC 4.2時,它工作正常。
這當然看起來像一個編譯器錯誤,但我不知道如果我在Clang做這個錯誤。 Clang中有沒有我沒有考慮的差異,或者這確實是一個錯誤?
編輯:我還沒有嘗試Cla(3.0)的最新版本,因爲我現在卡住使用Xcode。
非常好,謝謝。 – Kyle 2011-12-25 20:01:33