2011-12-13 18 views
13

Según el sitio this, se pueden usar variables de tipo volatile sig_atomic_t dentro de un manejador de señal. Ahora mi pregunta es, por ejemplo, algo así como el siguiente código aún sería atómico y, por lo tanto, ¿no introduciría condiciones de carrera?Uso apropiado de volátil sig_atomic_t

Supongamos que estamos utilizando un procesador multinúcleo (EDIT: ejecuta un programa multiproceso). ¿Funciona volatile sig_atomic_t incluso para sistemas multinúcleo en primer lugar o deberíamos usar el atomic<unsigned int> de C++ 11 para manejadores de señal en un sistema multinúcleo (EDIT: ejecutar un programa multiproceso)?

volatile sig_atomic_t a; 

static void signal_handler(int sig, siginfo_t *si, void *unused) 
{ 
    int b; 
    ................ 
    b = ...; 
    a = a | b; 
    ................ 
} 
+0

Su pregunta fue respondida ("¿Funciona sig_atomic_t volátil incluso para sistemas multinúcleo en primer lugar" - no), por lo que debe aceptar la respuesta proporcionada. – Bulwersator

Respuesta

15

A menos que su programa es multiproceso, los gestores de señales no coincide en el tiempo con otro código en su programa, y ​​ciertamente no coincide en el tiempo con el código que han interrumpido. Su código está bien siempre que la señal sig esté enmascarada durante la duración del manejador de señal.

+2

Mi programa es multiproceso. – MetallicPriest

+18

Bueno, entonces 'sig_atomic_t' no tiene nada que ver con el aspecto de múltiples subprocesos. Solo es relevante para garantizar la atomicidad de las operaciones interrumpidas por un controlador de señal * en el mismo subproceso *, es decir, para garantizar que no se obtiene una secuencia como: (1) flujo de programa principal escribe byte alto, (2) manejador de señal escribe un nuevo valor para la variable completa y regresa, (3) el flujo del programa principal escribe byte bajo (debido a la interrupción por una señal entre escrituras parciales). –