2010-11-13 107 views
0

考慮以下代碼:與G ++ CAS奇怪行爲

#include <iostream> 
using namespace std; 

int main() 
{ 
    bool lock = false; 
    lock = __sync_val_compare_and_swap(&lock, false, true); 
    cout << lock << endl; 
} 

我期望要顯示的結果作爲1而O/P是0只需調用__sync_val_compare_and_swap(&lock, false, true);(因此,返回值未被捕獲),然後顯示鎖定結果1顯示。

我在這裏錯過了什麼?

回答

4

從GCC DOCO:

bool __sync_bool_compare_and_swap (type *ptr, type oldval type newval, ...) type __sync_val_compare_and_swap (type *ptr, type oldval type newval, ...)

這些建宏執行的原子比較並交換。也就是說,如果* ptr的當前值是oldval,則將newval寫入* ptr。

如果比較成功並寫入newval,則「bool」版本返回true。 「val」版本在操作之前返回* ptr的內容。

在我看來,0是正確的值。我認爲你錯誤地將「... *ptr的內容在操作之前」分配給了lock

這應該輸出有意義的結果:

#include <iostream> 
using namespace std; 

int main() 
{ 
    bool lock = false; 
    bool oldvalue = __sync_val_compare_and_swap(&lock, false, true); 
    cout << lock << ", " << oldvalue << endl; 
} 
0

您在使用lock變量既可以作爲參數傳遞給__sync_val_compare_and_swap(指針lock傳遞)和爲__sync_val_compare_and_swap返回值的收件人。這似乎沒有多大意義。你對哪個價值感興趣?通過第一個參數返回的那個?或者返回的返回值爲__sync_val_compare_and_swap?決定哪一個你需要相應的行爲。

現在看起來__sync_val_compare_and_swap的返回值最後存儲在lock。根據__sync_val_compare_and_swap的規格,該值應爲0。這是您在實驗中看到的價值。