Abrufen und Hinzufügen mit OpenMP-Atomic-Operationen

Ich verwende OpenMP und muss den Vorgang zum Abrufen und Hinzufügen verwenden. OpenMP stellt jedoch keine entsprechende Anweisung / Aufforderung zur Verfügung. Ich möchte die maximale Portabilität bewahren, daher möchte ich mich nicht auf Compiler-Eigenheiten verlassen.

Ich suche nach einer Möglichkeit, die atomaren Operationen von OpenMP zu nutzen, um dies zu implementieren, aber ich bin in eine Sackgasse geraten. Kann das überhaupt gemacht werden? NB, der folgende Codefas macht was ich will:

#pragma omp atomic
x += a

Almost - aber nicht ganz, da ich wirklich den alten Wert von @ braucx. fetch_and_add sollte definiert werden, um dasselbe Ergebnis wie das folgende zu erzielen (nur nicht sperrend):

template <typename T>
T fetch_and_add(volatile T& value, T increment) {
    T old;
    #pragma omp critical
    {
        old = value;
        value += increment;
    }
    return old;
}

(Eine äquivalente Frage könnte für Compare-and-Swap gestellt werden, aber eine kann in Bezug auf die andere implementiert werden, wenn ich mich nicht irre.)

Antworten auf die Frage(4)

Ihre Antwort auf die Frage