2012-08-22 17 views
9

संभव डुप्लिकेट:
C++11 thread_local in gcc - alternatives
Is there any way to fully emulate thread_local using GCC's __thread?सी ++ में थ्रेड स्थानीय चर को कैसे प्रारंभ करें?

मैं C++ 11 thread_local उपयोग करने के लिए बना सकते हैं और thread_local चर का उपयोग करना चाहता था लेकिन के रूप में यह अभी तक जीसीसी द्वारा समर्थित नहीं है, मैं जीसीसी विशिष्ट __thread का उपयोग कर रहा हूँ। जिस तरह से मैं चर घोषित

myClass 
{ 
public: 

    static __thread int64_t m_minInt; 

}; 
__thread int64_t myClass::m_minInt = 100; 

है जब मैं यह संकलन, मैं कैसे ठीक से यह करने के लिए

error: ‘myClass::minInt’ is thread-local and so cannot be dynamically initialized 

की तरह कोई त्रुटि मिलती है?

पुनश्च: जीसीसी संस्करण: 4.6.3

+6

@betabandido जो प्रश्न आपने लिंक किया है वह C++ 11 में thread_local के विकल्प पर चर्चा करता है। मेरा सवाल यह है कि जीसीसी से __thread का उपयोग कैसे करें। विशेष रूप से प्रश्न में त्रुटि संदेश। मैंने इसे कहीं और खोजने की कोशिश की लेकिन इसे प्राप्त नहीं किया। धन्यवाद। – polapts

उत्तर

5

आप आलसी आरंभीकरण उपयोग करने के लिए की जरूरत है।

myClass 
{ 
public: 

    static __thread int64_t m_minInt; 
    static __thread bool m_minIntInitialized; 

    static int64_t getMinInt(); 
}; 
__thread int64_t myClass::m_minInt; 
__thread bool myClass::m_minIntInitialized; 


int64_t myClass::getMinInt() 
{ 
    if (!m_minIntInitialized) // note - this is (due to __thread) threadsafe 
    { 
    m_minIntInitialized = true; 
    m_minInt = 100; 
    } 

    return m_minInt; 
} 

m_minIntInitialized शून्य होने की गारंटी है।

ज्यादातर मामलों में (ELF specification) इसे .tbs अनुभाग में रखा गया है, जो शून्य-प्रारंभिक है।

सी ++ के लिए - http://en.cppreference.com/w/cpp/language/initialization

अन्य सभी गैर-स्थानीय स्थिर और धागे की स्थानीय चर के लिए, शून्य प्रारंभ होता है। अभ्यास में, पर जाने वाले चर शून्य-प्रारंभिक प्रोग्राम छवि के .bss सेगमेंट में रखे गए हैं, जिसमें डिस्क पर कोई स्थान नहीं है, और प्रोग्राम लोड करते समय ओएस द्वारा शून्य आउट किया गया है।

+7

आप कैसे जानते हैं m_minIntInitialized प्रारंभ में गलत है? – CygnusX1

+2

@ CygnusX1, मैंने जवाब अपडेट किया है। – nothrow

+0

आपके पास दौड़ की स्थिति है: ध्वज को सही पर सेट करने के बाद अन्य धागा m_minInt पढ़ सकता है लेकिन चर प्रारंभ होने से पहले; – gdy