मैं अपनी कक्षा में कुछ थ्रेड पंजीकरण करना चाहता हूं, इसलिए मैं इस 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सदस्य को यह समस्या क्यों नहीं है?