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.