c++ - threading - vpn multi thread




C++: variabili statiche nel programma multithread (2)

Qual è il problema con l'avere variabili statiche (specialmente all'interno delle funzioni) in programmi multithread?

Grazie.


L'inizializzazione non è thread-safe. Due thread possono entrare nella funzione ed entrambi possono inizializzare la variabile statica di scope della funzione. Questo non è buono. Non si può dire quale potrebbe essere il risultato.

In C ++ 0x, l'inizializzazione delle variabili statiche dell'ambito della funzione sarà thread-safe; il primo thread per chiamare la funzione inizializzerà la variabile e qualsiasi altro thread che chiama quella funzione dovrà bloccare fino a che l'inizializzazione non sia stata completata.

Non penso ci siano al momento compilatori + coppie di librerie standard che implementino completamente il modello di memoria di concorrenza C ++ 0x e le librerie di supporto del thread e di atomics.


Una variabile statica di solito significa che più invocazioni della tua funzione condividono uno stato e quindi interferiscono l'una con l'altra.

Normalmente vuoi che le tue funzioni siano autonome; avere copie locali di tutto ciò su cui lavorano e non condividere nulla con i parametri della barra del mondo esterno e i valori di ritorno. (Che, se si pensa in un certo modo, non fanno comunque parte della funzione.)

Tenere conto:

int add(int x, int y);

copie locali di x e sicuramente thread-safe.

void print(const char *text, Printer *printer);

pericoloso, qualcuno al di fuori potrebbe fare qualcosa con la stessa stampante, ad esempio chiamando un altro print () su di esso.

void print(const char *text);

sicuramente non thread-safe, due invocazioni parallele sono garantite per utilizzare la stessa stampante.

Certo, ci sono modi per proteggere l'accesso alle risorse condivise (parola chiave di ricerca: mutex ); questo è esattamente come dovrebbe essere il tuo istinto.

Le scritture parallele non sincronizzate su una variabile sono anche non thread-safe per la maggior parte del tempo, così come le letture e le scritture. (cerca parole chiave: synchronization , synchronization primitives [di cui il mutex è uno solo], anche atomicity / atomic operation per quando l'accesso parallelo è sicuro.)





static