2010-11-13 3 views
0

Tenir compte de ce code:Comportement étrange avec G ++ CAS

#include <iostream> 
using namespace std; 

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

Je pense que le résultat soit affiché comme 1, mais l'o/p est 0. Juste appeler __sync_val_compare_and_swap(&lock, false, true); (donc la valeur de retour ne soit pas capturé) puis l'affichage du verrouillage entraîne l'affichage de 1.

Qu'est-ce qui me manque ici?

Répondre

4

De l'doco GCC:

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

Ces builtins effectuer un atomique comparer et échanger. Autrement dit, si la valeur actuelle de * ptr est oldval, alors écrivez newval dans * ptr.

La version "bool" renvoie true si la comparaison a réussi et que newval a été écrit. La version "val" renvoie le contenu de * ptr avant l'opération.

Il me semble que 0 est la bonne valeur. Je pense que vous attribuez incorrectement "... le contenu de *ptr avant l'opération" à lock.

Cette sortie devrait les résultats sensibles:

#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

Vous utilisez votre variable lock à la fois comme un argument pour __sync_val_compare_and_swap (un pointeur vers lock est passé) et un destinataire pour la valeur de retour de __sync_val_compare_and_swap. Cela ne semble pas avoir beaucoup de sens. Quelle est la valeur qui vous intéresse? L'un est revenu à travers le premier argument? Ou celui retourné comme la valeur de retour de __sync_val_compare_and_swap? Décidez lequel vous avez besoin d'agir en conséquence.

En ce moment, il semble que la valeur de retour de __sync_val_compare_and_swap est stockée en lock dernière. Cette valeur doit être 0, conformément à la spécification de __sync_val_compare_and_swap. C'est la valeur que vous voyez dans votre expérience.