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 Barsınıf statik sahiptir thread_localüyesi foo. Statik thread_local Foo foooluş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 Barkullanan yapıcıdaki yorumu kaldırırsam fookod iyi çalışıyor.
Bunu GCC (7.4.0) ve Clang (6.0.0) üzerinde denedim ve sonuçlar aynı. Derleyicinin fookullanı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?