Quali sono i modelli di memoria C++ 98 e C++ 11 per gli array locali e le interazioni con i thread?C++ variabili locali e thread (non thread_local)
Sono non riferendosi alla thread_local parola chiave C++ 11 , che appartiene a variabili globali e statiche.
Invece, mi piacerebbe scoprire qual è il comportamento garantito dei thread per gli array allocati in fase di compilazione. Per compile-time intendo "int array [100]", che è diverso per l'allocazione utilizzando la nuova parola chiave new []. Non intendo le variabili statiche.
Per esempio, diciamo che ho la seguente struct/classe:
struct xyz { int array[100]; };
e la seguente funzione:
void fn(int x) {
xyz dog;
for(int i=0; i<100; ++i) { dog.array[i] = x; }
// do something else with dog.array, eg. call another function with dog as parameter
}
E 'sicuro di chiamare fn() da più thread? Sembra che il modello di memoria C++ sia: tutte le variabili e gli array non statici locali sono allocati nello stack e ogni thread ha il proprio stack. È vero (questo è ufficialmente parte dello standard)?
Grazie. È scritto esplicitamente nello standard C++ 11? – mtall
@mtall: indirettamente. Tutte le variabili non statiche in un corpo di funzione fanno parte dell'ambito della funzione e hanno durata di archiviazione automatica. Questo vale anche per le funzioni invocate da 'std :: thread :: thread (F &&, Args && ...)'. Quindi devi leggere quattro sezioni diverse se vuoi risolvere tutto insieme. – Zeta
Alla fine, ogni chiamata a 'fn' creerà la propria istanza di' xyz'.Quindi se due thread chiamano 'fn' allo stesso tempo, allora entrambi i thread creeranno e modificheranno la propria istanza di' xyz', che è thread-safe. – TianyuZhu