Desidero verificare che la mia comprensione sia corretta. Questo genere di cose è complicato quindi sono quasi sicuro che mi manca qualcosa. Ho un programma composto da un thread in tempo reale e un thread non in tempo reale. Voglio che il thread non RT sia in grado di scambiare un puntatore con la memoria utilizzata dal thread RT.Swap atomico in GNU C++
Dalla documentazione, la mia comprensione è che questo può essere realizzato in g++
con:
// 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;
}
Questo è l'unico posto nel programma (diverso setup iniziale) dove rt_data
viene modificato. Quando rt_data
viene utilizzato nel contesto in tempo reale, viene copiato su un puntatore locale. Per old_d
, in seguito, quando è sicuro che la vecchia memoria non viene utilizzata, verrà liberata nel thread non RT. È corretto? Ho bisogno di volatile
ovunque? Ci sono altre primitive di sincronizzazione che dovrei chiamare?
Tra l'altro sto facendo questo in C++, anche se sono interessati a sapere se la risposta è diversa per C.
Grazie davanti a tempo.
Grazie! Potrei seguire il tuo suggerimento di usare std :: atomic, che è eccellente. (Non ho ancora familiarizzato con la più recente roba C++ 0x.) Solo per curiosità, se uso __sync_lock_test_and_set, qual è il recinto corretto da usare durante la lettura? (cioè, per fare una copia locale) – Steve