Wann wird eine globale Variable "thread_local" initialisiert?

Betrachten Sie das folgende Beispielcout der Einfachheit halber weggelassen).

#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;
}

Sowohl auf clang als auch auf gcc gibt dieses Programm nichts aus, wenn der Benutzer '0' schreibt, während es drucktConstructor/Destructor 10 Mal, wenn der Benutzer eine Zahl ungleich Null eingibt. Außerdem beschwert sich clang über ein offensichtliches nicht verwendetes Ausdrucksergebnis.

Seit einemthread_local Die Speicherlebensdauer soll die gesamte Lebensdauer des Threads umfassen, wie ich erwartet habefoo Variable, die in jedem Thread unabhängig von der Benutzereingabe initialisiert werden soll.

Ich möchte vielleicht eine habenthread-local Variable für den alleinigen Zweck, eine Nebenwirkung im Konstruktor zu haben, gibt der Standard vor, dass athread_local Objekt wird bei der ersten Verwendung initialisiert?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage