c++ multithreading c++11 thread-local

c++ - ¿Cuándo se inicializa una variable global `thread_local`?



multithreading c++11 (1)

Considere el siguiente ejemplo (los guardias de bloqueo en cout omiten por simplicidad).

#include <future> #include <iostream> #include <thread> using namespace std; struct C { C() { cout << "C constructor/n";} ~C() { cout << "C destructor/n";} }; thread_local C foo; int main() { int select; cin >> select; future<void> f[10]; for ( int i = 0;i < 10; ++i) f[i] = async( launch::async,[&](){ if (select) foo; } ); return 0; }

Tanto en clang como en gcc, este programa no produce nada si el usuario escribe ''0'', mientras que imprime el Constructor / Destructor 10 veces si el usuario ingresa un número distinto de cero. Además, Clang se queja de un resultado obvio de expresión no utilizada.

Dado que se supone que el tiempo de vida de un almacenamiento thread_local abarca toda la vida del subproceso, esperaba que la variable foo se inicializara en cada subproceso, independientemente de la entrada del usuario.

Es posible que desee tener una variable de thread-local con el único propósito de tener un efecto secundario en el constructor, ¿el estándar ordena que un objeto thread_local se inicialice en su primer uso?


El estándar permite este comportamiento, aunque no lo garantiza. Desde 3.7.2 / 2 [basic.stc.thread]:

Una variable con duración de almacenamiento de subprocesos se inicializará antes de su primer uso (3.2) y, si se construye, se destruirá al salir del subproceso.

También es posible que los objetos se construyan en algún otro momento (por ejemplo, en el inicio del programa), ya que "antes del primer uso" significa "en cualquier punto, siempre y cuando esté antes" en lugar de "justo antes".