Comment implémenter un incrément atomique d'un pointeur sur un entier en utilisant C ++ 11 & lt; atomic & gt ;?

Alors que le portage de certaines Fenêtres de code C++ pour iOS, j'ai besoin de fournir une implémentation de Win32 l' long InterlockedIncrement(long *p) appel. C'est assez facile en utilisant les fonctions définies dans <libkern/OSAtomic.h>.

Cependant, je me demande si il est possible de l'écrire dans un OS de façon agnostique en utilisant juste le C++11 installations, principalement <atomic>. Je suis venu avec, ce que je ne suis pas sûr accomplit ce que je veux:

inline long InterlockedIncrement(long* p)
{
    std::atomic<long&> atomicP(*p);
    return ++atomicP;
}

Fait ce travail? Est-ce suffisant? Les deux lignes ne sont pas atomiques, mais l'incrément doit être atomique, qui est la clé ici.

Tous les exemples d'utilisation pour <atomic> que j'ai trouvé sont différents, d'où une std::atomic<T> est défini et utilisé directement. Ici, je veux utiliser une variable de type long que les appelants me passe par adresse. Je ne pouvais pas trouver un tel exemple.

Edit: Clang 3.2 (dans Xcode 4.x) ne peut pas compiler ++atomicP avec le message d'erreur "ne peut pas incrémenter la valeur de type std::atomic<long&>" (ni atomicP += 1).

Quelle serait la bonne façon?

Modifier à nouveau: un pointeur de mise en œuvre compile...

inline long InterlockedIncrement(long* p)
{
    std::atomic<long*> atomicP(p);
    return ++(*atomicP);
}

Mais j'ai peur que cela ne fonctionne pas, puisque je n'ai pas d'incrément un type atomique, mais la valeur pointée par le pointeur, ce qui n'est pas atomique.

source d'informationauteur Jean-Denis Muys