Porting InterlockedExchange, utilisant uniquement les éléments insortingnsèques de GCC

L’API Windows offre InterlockedExchange , qui définit une valeur de mémoire de manière atomique. En utilisant uniquement les éléments insortingnsèques de GCC, j’aimerais créer un équivalent de cette fonction. Est-il suffisant de définir la valeur puis d’appeler une barrière de mémoire (voir le code ci-dessous)?

 template  T InterlockedExchange(volatile T& _data, T _value) { const T oldValue = _data; _data = _value; __sync_synchronize(); return oldValue; } 

Je vous remercie.

EDIT : L’extrait proposé n’EST PAS une solution correcte au problème, car il n’est clairement pas atomique (mais, je devais au moins essayer).

    Utilisez __sync_val_compare_and_swap __sync_lock_test_and_set , pas __sync_synchronize .

    Cela a exactement la même fonction que InterlockedExchange.

    Quelque chose comme ça (code non testé!):

     template T InterlockedExchange(T& data, T& new_val) { return __sync_lock_test_and_set(&data, new_val); } 

    MODIFIER:
    Oi, j’ai mal lu, vous vouliez InterlockedExchange, pas InterlockedCompareExchange … donc c’est __sync_lock_test_and_set (le nom est un nom Intel trompeur, mais c’est exactement ce que vous voulez).
    Voir ici , en bas de la page.

    Votre exemple proposé n’est pas équivalent car il n’est pas atomique. Deux threads de course exécutant votre fonction peuvent tous deux récupérer la même valeur ancienne, l’une des nouvelles valeurs étant “perdue”.