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?