Atomic Swap in GNU C ++

Ich möchte überprüfen, ob mein Verständnis korrekt ist. Diese Art von Dingen ist knifflig, also bin ich mir fast sicher, dass mir etwas fehlt. Ich habe ein Programm, das aus einem Echtzeit-Thread und einem Nicht-Echtzeit-Thread besteht. Ich möchte, dass der Nicht-RT-Thread einen Zeiger auf den Speicher austauschen kann, der vom RT-Thread verwendet wird.

Aus den Dokumenten geht meines Erachtens hervor, dass dies in erreicht werden kanng++ mit:

// global
Data *rt_data;

Data *swap_data(Data *new_data)
{
#ifdef __GNUC__
    // Atomic pointer swap.
    Data *old_d = __sync_lock_test_and_set(&rt_data, new_data);
#else
    // Non-atomic, cross your fingers.                                          
    Data *old_d = rt_data;
    rt_data = new_data;
#endif
    return old_d;
}

Dies ist der einzige Ort im Programm (außer der Ersteinrichtung), an demrt_data geändert wird. Wannrt_data wird im Echtzeitkontext verwendet und in einen lokalen Zeiger kopiert. Zumold_dWenn später sicher ist, dass der alte Speicher nicht verwendet wird, wird er im Nicht-RT-Thread freigegeben. Ist das richtig? Brauche ichvolatile irgendwo? Gibt es andere Synchronisationsprimitive, die ich anrufen sollte?

Übrigens mache ich das in C ++, obwohl ich daran interessiert bin, ob die Antwort für C unterschiedlich ist.

Vielen Dank im Voraus.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage