2012-05-11 4 views
6

Ho visto questo in una parte che non viene mai chiamato in codice di un collega:Cosa succede mentre (! Volatile); fare?

volatile unsigned char vol_flag = 0; 
// ... 
while(!vol_flag); 

vol_flag è dichiarata nel file di intestazione, ma non è mai cambiato. Ho ragione che questo porterà al programma sospeso in un ciclo infinito? C'è una via d'uscita?

+2

Sembra uno spin-lock mal fatto con codice multi-thread. –

+1

Forse è per il debug? – animaonline

+2

Il codice come questo si trova di solito nei programmi per i microcontroller. – alexander

risposta

16

In genere un codice come questo indica che vol_flag è stato modificato esternamente ad un certo punto. Qui, esternamente può significare un thread diverso, un gestore di interrupt, un componente hardware (in caso di IO mappato in memoria) ecc. Questo ciclo attende in modo efficace l'evento esterno che modifica il flag.

La parola chiave volatile è un modo per il programmatore di esprimere il fatto che non è sicuro assumere ciò che è evidente dal codice: vale a dire che il flag non viene modificato nel ciclo. Così, impedisce al compilatore di fare ottimizzazioni che potrebbero compromettere le intenzioni dietro il codice. Invece, il compilatore è costretto a fare un riferimento di memoria per recuperare il valore del flag.

noti che (a differenza di Java) volatile in C/C++ non stabilisce accade-prima rapporto e non garantisce alcun ordine o la visibilità di riferimenti alla memoria attraverso l'accesso volatile. Inoltre, non garantisce l'atomicità dei riferimenti variabili. Quindi, non è uno strumento per la comunicazione tra i thread. Vedi this per i dettagli.