Voglio fare una registrazione di thread nella mia classe, quindi decido di aggiungere un controllo per la thread_local
funzione:
#include <iostream>
#include <thread>
class Foo {
public:
Foo() {
std::cout << "Foo()" << std::endl;
}
~Foo() {
std::cout << "~Foo()" << std::endl;
}
};
class Bar {
public:
Bar() {
std::cout << "Bar()" << std::endl;
//foo;
}
~Bar() {
std::cout << "~Bar()" << std::endl;
}
private:
static thread_local Foo foo;
};
thread_local Foo Bar::foo;
void worker() {
{
std::cout << "enter block" << std::endl;
Bar bar1;
Bar bar2;
std::cout << "exit block" << std::endl;
}
}
int main() {
std::thread t1(worker);
std::thread t2(worker);
t1.join();
t2.join();
std::cout << "thread died" << std::endl;
}
Il codice è semplice La mia Bar
classe ha un thread_local
membro statico foo
. Se thread_local
Foo foo
viene creato uno statico , significa che viene creato un thread.
Ma quando eseguo il codice, niente nelle Foo()
stampe, e se rimuovo il commento nel Bar
costruttore di, che usa foo
, il codice funziona bene.
Ho provato questo su GCC (7.4.0) e Clang (6.0.0) e i risultati sono gli stessi. Immagino che il compilatore abbia scoperto che foo
non è in uso e non genera un'istanza. Così
- Il compilatore ha ignorato il
static thread_local
membro? Come posso eseguire il debug per questo? - In tal caso, perché un
static
membro normale non ha questo problema?