Troca atômica no GNU C ++

Quero verificar se meu entendimento está correto. Esse tipo de coisa é complicada, então tenho quase certeza de que estou perdendo alguma coisa. Eu tenho um programa que consiste em um thread em tempo real e um thread não em tempo real. Desejo que o segmento não RT possa trocar um ponteiro para a memória usada pelo segmento RT.

A partir dos documentos, meu entendimento é que isso pode ser realizado emg++ com:

// 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 é o único local do programa (exceto a configuração inicial) em quert_data é modificado. Quandort_data é usado no contexto em tempo real, é copiado para um ponteiro local. Paraold_d, mais tarde, quando tiver certeza de que a memória antiga não é usada, ela será liberada no thread não RT. Isso está correto? Eu precisovolatile qualquer lugar? Existem outras primitivas de sincronização que devo chamar?

A propósito, eu estou fazendo isso em C ++, embora eu esteja interessado em saber se a resposta é diferente para C.

Obrigado antecipadamente.

questionAnswers(2)

yourAnswerToTheQuestion