2011-12-13 4 views
13

Selon le site this, on peut utiliser des variables de type volatile sig_atomic_t dans un gestionnaire de signal. Maintenant ma question est, serait par exemple quelque chose comme le code suivant encore être atomique et ainsi introduire aucune condition de course? Supposons que nous utilisons un processeur multicœur (EDIT: exécution d'un programme multithread). Est-ce que volatile sig_atomic_t fonctionne même pour les systèmes multicœurs en premier lieu ou devrions-nous utiliser le atomic<unsigned int> de C++ 11 pour les gestionnaires de signaux sur un système multicœur (EDIT: exécution d'un programme multithread)?Utilisation correcte du volatile sig_atomic_t

volatile sig_atomic_t a; 

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

Votre question a reçu une réponse ("Est-ce que volatile sig_atomic_t fonctionne même pour les systèmes multicœurs en premier lieu" - non), vous devez donc accepter la réponse fournie. – Bulwersator

Répondre

15

À moins que votre programme est multithread, les gestionnaires de signaux ne fonctionnent simultanément avec tout autre code dans votre programme, et ils courent certainement jamais en même temps que le code qu'ils ont interrompu. Votre code est correct tant que le signal sig est masqué pendant la durée du gestionnaire de signal.

+2

Mon programme est multithread. – MetallicPriest

+18

Eh bien alors 'sig_atomic_t' n'a rien à voir avec l'aspect multi-thread. Cela n'est important que pour assurer l'atomicité des opérations interrompues par un gestionnaire de signal * dans le même thread *, c'est-à-dire pour éviter une séquence comme: (1) le flux principal écrit un octet haut, (2) un gestionnaire de signal écrit un nouvelle valeur à la variable entière et retourne, (3) le flux principal du programme écrit octet faible (en raison de l'interruption par un signal entre les écritures partielles). –