Je veux vérifier que ma compréhension est correcte. Ce genre de chose est difficile, donc je suis presque sûr qu'il me manque quelque chose. J'ai un programme composé d'un thread en temps réel et d'un thread en temps non réel. Je veux que le thread non RT puisse échanger un pointeur vers la mémoire utilisée par le thread RT.Échange atomique dans GNU C++
De la documentation, je crois comprendre que cela peut être accompli en g++
avec:
// 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;
}
C'est le seul endroit dans le programme (autre que la configuration initiale) où rt_data
est modifié. Lorsque rt_data
est utilisé dans le contexte temps réel, il est copié dans un pointeur local. Pour old_d
, plus tard, lorsqu'il est certain que l'ancienne mémoire n'est pas utilisée, elle sera libérée dans le thread non RT. Est-ce correct? Ai-je besoin de volatile
partout? Y a-t-il d'autres primitives de synchronisation que je devrais appeler?
Par la façon dont je fais cela en C++, bien que je suis intéressé à savoir si la réponse est différente pour C.
Merci à l'avance.
Merci! Je peux suivre votre suggestion d'utiliser std :: atomic, c'est excellent. (Je ne suis pas encore familiarisé avec les dernières nouveautés en C++ 0x.) Juste par curiosité, si j'utilise __sync_lock_test_and_set, quelle est la bonne clôture à utiliser lors de la lecture? (c'est-à-dire, pour faire une copie locale) – Steve