2011-12-13 17 views
13

In base al sito this, è possibile utilizzare variabili di tipo volatile sig_atomic_t all'interno di un gestore di segnale. Ora la mia domanda è, ad esempio, qualcosa come il seguente codice sarà ancora atomico e quindi non introdurrà condizioni di gara?Uso corretto di vol. Sig_atomic_t

Si supponga di utilizzare un processore multicore (EDIT: esecuzione di un programma con multithreading). volatile sig_atomic_t funziona anche per sistemi multicore in primo luogo o dovremmo utilizzare lo atomic<unsigned int> di C++ 11 per gestori di segnale su un sistema multicore (EDIT: esecuzione di un programma con multithreading)?

volatile sig_atomic_t a; 

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

La tua domanda è stata risolta ("Volatile sig_atomic_t funziona anche per sistemi multicore in primo luogo" - no), quindi è necessario accettare la risposta fornita. – Bulwersator

risposta

15

A meno che il vostro programma è multithreaded, gestori di segnale mai eseguiti in concomitanza con altro codice nel vostro programma, e che certamente non corrono in concomitanza con il codice che hanno interrotto. Il tuo codice va bene finché il segnale sig è mascherato per la durata del gestore di segnale.

+2

Il mio programma è multithread. – MetallicPriest

+18

Bene, allora "sig_atomic_t' non ha nulla a che fare con l'aspetto multi-thread. È rilevante solo per garantire l'atomicità delle operazioni interrotte da un gestore di segnale * nello stesso thread *, vale a dire assicurarsi di non ottenere una sequenza come: (1) il flusso del programma principale scrive byte alto, (2) il gestore di segnale scrive un nuovo valore per l'intera variabile e restituisce, (3) il flusso del programma principale scrive byte bassi (a causa dell'interruzione di un segnale tra scritture parziali). –