简体   繁体   中英

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 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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM