Intercambio atómico en GNU C ++

Quiero verificar que mi comprensión es correcta. Este tipo de cosas es complicado, así que estoy casi seguro de que me falta algo. Tengo un programa que consta de un hilo en tiempo real y un hilo no en tiempo real. Quiero que el hilo no RT pueda intercambiar un puntero a la memoria que usa el hilo RT.

Según los documentos, entiendo que esto se puede lograr eng++ 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;
}

Este es el único lugar en el programa (que no sea la configuración inicial) dondert_data es modificado. Cuandort_data se usa en el contexto en tiempo real, se copia en un puntero local. porold_d, más adelante, cuando esté seguro de que no se usa la memoria anterior, se liberará en el subproceso no RT. ¿Es esto correcto? Lo necesitovolatile ¿en cualquier sitio? ¿Hay otras primitivas de sincronización que debería llamar?

Por cierto, estoy haciendo esto en C ++, aunque estoy interesado en saber si la respuesta es diferente para C.

Gracias de antemano.