2016-03-28 27 views
5
void HelloWorld() 
{ 
    static std::atomic<short> static_counter = 0; 
    short val = ++static_counter; // or val = static_counter++; 
} 

Se questa funzione viene chiamata da due fili,Discussione sicuro variabile locale

grado la variabile locale val essere 1 in entrambi i fili? o (0 se viene utilizzato static_counter++?)

+1

Possibile duplicato http://stackoverflow.com/questions/8102125/is-local-static-variable-initialization-thread-safe-in-c11 – user2807083

+0

@ user2807083 Questa non è la domanda. So che static_counter sarà inizializzato in modo sicuro. Lo standard C++ 11 lo richiede. Sto parlando di val, che non è statico .. – James

+1

Penso che qui non sia nulla circa il tuo 'var' locale, ma tutto ciò che riguarda l'operatore ++ applicato alla variabile statica. Quindi penso che la domanda giusta sia "L'incremento del thread variabile atomico è sicuro?" – user2807083

risposta

2

La variabile locale val può essere 1 in entrambi i thread?

No. ++static_counter è equivalente a:

fetch_add(1)+1 

che non può tornare stesso valore per due (o più) thread perchéfetch_add viene eseguita atomicamente.

+0

Lo stesso vale per static_counter ++? – James

+0

Sì. Questo è equivalente a 'fetch_add (1)'. Per favore leggi [il documento] (http://en.cppreference.com/w/cpp/atomic/atomic/operator_arith) per maggiori dettagli. – Nawaz

+0

Ci sono due cose in ballo, la costruzione dell'oggetto 'static_counter' e l'operazione di incremento. Quest'ultimo è garantito per essere atomico, ma secondo il link nei commenti, la costruzione non lo è. –

2

No. L'unico modo in cui lo val potrebbe avere lo stesso valore in entrambi i thread è se le due operazioni atomiche si sovrappongono. Per definizione, le operazioni atomiche non possono sovrapporsi.