मैं अपनी कक्षा में कुछ थ्रेड पंजीकरण करना चाहता हूं, इसलिए मैं इस thread_local
सुविधा के लिए एक चेक जोड़ने का निर्णय लेता हूं :
#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;
}
कोड सरल है। मेरी Bar
कक्षा में एक स्थिर thread_local
सदस्य है foo
। यदि एक स्थैतिक thread_local
Foo foo
बनाया जाता है, तो इसका मतलब है कि एक धागा बनाया जाता है।
लेकिन जब मैं कोड चलाता हूं, तो Foo()
प्रिंट में कुछ भी नहीं होता है , और यदि मैं टिप्पणी को Bar
निर्माणकर्ता में हटा देता हूं , जो उपयोग करता है foo
, तो कोड ठीक काम करता है।
मैंने जीसीसी (7.4.0) और क्लैंग (6.0.0) पर यह कोशिश की और परिणाम समान हैं। मुझे लगता है कि संकलक की खोज की गई है foo
जो अप्रयुक्त है और एक उदाहरण उत्पन्न नहीं करता है। इसलिए
- क्या कंपाइलर ने
static thread_local
सदस्य की अनदेखी की ? मैं इसके लिए डीबग कैसे कर सकता हूं? - यदि हां, तो एक सामान्य
static
सदस्य को यह समस्या क्यों नहीं है?