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 consiste en un hilo en tiempo real y un hilo no en tiempo real. Quiero que el subproceso que no sea RT pueda intercambiar un puntero a la memoria que usa el subproceso RT.Intercambio atómico en GNU C++
A partir de los documentos, mi entendimiento es que esto se puede lograr en 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;
}
Este es el único lugar en el programa (que no sea la configuración inicial), donde se modifica rt_data
. Cuando se usa rt_data
en el contexto en tiempo real, se copia a un puntero local. Para old_d
, más adelante cuando esté seguro de que no se usa la memoria anterior, se liberará en la secuencia que no sea RT. ¿Es esto correcto? ¿Necesito volatile
en algún lado? ¿Hay otras primitivas de sincronización que debería llamar?
Por cierto que estoy haciendo esto en C++, aunque estoy interesado en saber si la respuesta es diferente para C
Gracias de antemano.
¡Gracias! Puedo seguir tu sugerencia de usar std :: atomic, eso es excelente. (Todavía no estoy familiarizado con las últimas novedades de C++ 0x). Solo por curiosidad, si uso __sync_lock_test_and_set, ¿cuál es la valla correcta para usar mientras leo? (es decir, para hacer una copia local) – Steve