Sınıfımda bazı iş parçacığı kaydı yapmak istiyorum, bu yüzden thread_local
özelliği için bir kontrol eklemeye karar :
#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;
}
Kod basit. Benim Bar
sınıf statik sahiptir thread_local
üyesi foo
. Statik thread_local
Foo foo
oluşturulursa, bir iş parçacığının oluşturulduğu anlamına gelir.
Ancak kodu çalıştırdığımda, Foo()
baskılarda hiçbir şey yok ve yorumu Bar
kullanan yapıcıdaki yorumu kaldırırsam foo
kod iyi çalışıyor.
Bunu GCC (7.4.0) ve Clang (6.0.0) üzerinde denedim ve sonuçlar aynı. Derleyicinin foo
kullanılmayan ve bir örnek oluşturmadığını keşfettiğini tahmin ediyorum . Yani
- Derleyici
static thread_local
üyeyi görmezden geldi mi? Bunun için nasıl hata ayıklayabilirim? - Öyleyse, normal bir
static
üyenin neden bu sorunu yoktur?