Strange behavior with G++ CAS
Consider this code:
#include <iostream>
using namespace std;
int main()
{
bool lock = false;
lock = __sync_val_compare_and_swap( &lock, false, true );
cout << lock << endl;
}
I expect the result to be displayed as 1 but the开发者_C百科 o/p is 0. Just calling __sync_val_compare_and_swap( &lock, false, true ); (so the return value is not captured) and then displaying lock results in 1 being displayed.
What am I missing here?
From the 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, ...)These builtins perform an atomic compare and swap. That is, if the current value of *ptr is oldval, then write newval into *ptr.
The “bool” version returns true if the comparison is successful and newval was written. The “val” version returns the contents of *ptr before the operation.
Seems to me that 0 is the right value. I think you are incorrectly assigning "...the contents of *ptr before the operation" to lock.
This should output sensible results:
#include <iostream>
using namespace std;
int main()
{
bool lock = false;
bool oldvalue = __sync_val_compare_and_swap( &lock, false, true );
cout << lock << ", " << oldvalue << endl;
}
You are using your lock variable as both an argument to __sync_val_compare_and_swap (a pointer to lock is passed) and a recipient for the return value of __sync_val_compare_and_swap. This doesn't seem to make much sense. Which value are you interested in? The one returned through the first argument? Or the one returned as the return value of __sync_val_compare_and_swap? Decide which one you need an act accordingly.
Right now it looks that the return value of __sync_val_compare_and_swap is stored in lock last. That value should be 0, according to the specification of __sync_val_compare_and_swap. That's the value you are seeing in your experiment.
加载中,请稍侯......
精彩评论