Ich möchte überprüfen, ob mein Verständnis korrekt ist. So etwas ist schwierig, 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 Speicher austauschen kann, der vom RT-Thread verwendet wird.Atomic Swap in GNU C++
Aus den Dokumenten, mein Verständnis ist, dass dies in g++
mit erreicht werden kann:
// 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 die einzige Stelle im Programm (andere als Ersteinrichtung), wo rt_data
modifiziert wird. Wenn rt_data
im Echtzeitkontext verwendet wird, wird es in einen lokalen Zeiger kopiert. Für old_d
, später, wenn es sicher ist, dass der alte Speicher nicht verwendet wird, wird es im Nicht-RT-Thread freigegeben. Ist das richtig? Benötige ich volatile
irgendwo? Gibt es andere Synchronisationsprimitive, die ich aufrufen sollte?
Durch die Art, wie ich dies in C++ tue, obwohl ich interessiert bin, ob die Antwort für C. Zeit
Dank voraus unterscheidet.
Vielen Dank! Ich kann Ihrem Vorschlag von std :: atomic folgen, das ist ausgezeichnet. (Ich bin mit den neuesten C++ 0x-Sachen noch nicht gut vertraut.) Nur aus Neugierde, wenn ich __sync_lock_test_and_set verwende, was ist der richtige Zaun, der beim Lesen verwendet wird? (d. h. um eine lokale Kopie zu erstellen) – Steve