5

Tengo el siguiente bit del código C++ 11 que usa subprocesos e inicializaciones de variables estáticas. Mi pregunta es:inialización de variables estáticas C++ e hilos

¿Qué garantías o garantías tiene el lenguaje C++ sobre la inicialización única de variables estáticas? El código siguiente muestra los valores correctos, sin embargo, no puedo encontrar el pasaje en el nuevo estándar que menciona cómo el modelo de memoria debe interactuar con los hilos. ¿Cuándo es que las variables se vuelven locales?

#include <iostream> 
#include <thread> 

class theclass 
{ 
public: 
    theclass(const int& n) 
    :n_(n) 
    { printf("aclass(const int& n){}\n"); } 
    int n() const { return n_; } 
private: 
    int n_; 
}; 

int operator+(const theclass& c, int n) 
{ 
    return c.n() + n; 
} 

void foo() 
{ 
    static theclass x = 1; 
    static theclass y = x + 1; 
    printf("%d %d\n",x.n(),y.n()); 
} 

int main() 
{ 
    std::thread t1(&foo); 
    std::thread t2(&foo); 
    t1.join(); 
    t2.join(); 
    return 0; 
} 

Respuesta

8

El código hará lo que usted espera. Ver §6.7.4

variables locales estáticas son:

... inicializado el primer control de tiempo pasa por encima de su declaración ... Si control entra en la declaración al mismo tiempo, mientras que la variable se inicializa , la ejecución concurrente deberá esperar la finalización de la inicialización.

En otras palabras, el compilador garantiza que sus hilos cooperen en la inicialización de los locales estáticos. Cada uno de ellos se inicializará una vez y cada hilo solo tendrá acceso al objeto una vez que se haya inicializado por completo.

El compilador solo creará una variable local de subproceso cuando se solicite explícitamente con la palabra clave thread_local.