2010-09-17 14 views
10

सी ++ शिकायत सी ++ 0xसी ++ कंपाइलर सी ++ 0x में थ्रेड स्थानीय स्टोरेज को कैसे कार्यान्वित करता है?

में थ्रेड स्थानीय संग्रहण को कैसे कार्यान्वित करता है मैंने इसे Google में खोजा है। लेकिन मुझे इसके बारे में कुछ भी नहीं मिला।

क्या किसी के पास इस बारे में कोई सामग्री है ??

+0

सी ++ मानक में शून्य (या बहुत कम) कार्यान्वयन विवरण है। –

+0

यह अब मदद कर सकता है: http://www.akkadia.org/drepper/tls.pdf –

उत्तर

13

Wikipedia entry का एक पठन है।

थ्रेड-लोकल स्टोरेज ऐसा कुछ नहीं है जो सी ++ के लिए विशेष है। कभी-कभी यह विभिन्न नामों से जाता है, जैसे "टीएलएस" (केवल थ्रेड-लोकल स्टोरेज का संक्षेप), या "थ्रेड-विशिष्ट स्टोरेज" (टीएसएस)।

अधिकांश ऑपरेटिंग सिस्टम प्रति-थ्रेड स्टोरेज तक पहुंचने के लिए एपीआई प्रदान करते हैं। उदाहरण के लिए, विंडोज़ में "टीएलएस" से शुरू होने वाला bunch of API functions है। हुड के तहत, Win32 एक विशेष सीपीयू रजिस्टर (x86 पर एफएस) के माध्यम से सुलभ, उपयोगकर्ता थ्रेड-स्थानीय स्टोरेज सहित विभिन्न प्रकार के प्रति-थ्रेड डेटा के लिए एक विशेष क्षेत्र सुरक्षित रखता है। लिनक्स pthread_key_create जैसे नामों के साथ, लिथ्रेड एपीआई के माध्यम से थ्रेड-विशिष्ट स्टोरेज प्रदान करता है, और इन्हें आम तौर पर इसी तकनीक का उपयोग करके लागू किया जाता है।

यह संभव है कि एक ओएस बिल्कुल कोई समर्थन प्रदान न करे। हालांकि, यदि ओएस एक एपीआई के माध्यम से एक प्रक्रिया-अद्वितीय थ्रेड आईडी प्रदान करता है, तो सी ++ रनटाइम लाइब्रेरी कुछ std::map<thread_id, per_thread_storage> आंतरिक रूप से कुछ अवधारणात्मक रूप से बनाए रख सकती है। बेशक, तो per_thread_storage क्या है इसकी एक समस्या है। यदि कोई प्रोग्राम स्थैतिक रूप से जुड़ा हुआ था, तो यह प्रोग्राम में घोषित सभी थ्रेड-स्थानीय स्टोरेज चर के साथ एक बड़ी संरचना के लिए सूचक की तरह कुछ हो सकता है। यह एक oversimplification है, लेकिन आप सामान्य विचार मिलता है।

थ्रेड-स्थानीय स्टोरेज वेरिएबल एक्सेस करना स्पष्ट रूप से केवल एक सीधी मेमोरी पढ़ या लिखना नहीं है। यह संभावित रूप से उससे थोड़ा अधिक शामिल है। यदि आप किसी विशेष फ़ंक्शन में थ्रेड-लोकल/विशिष्ट स्टोरेज का उपयोग करने जा रहे हैं, तो मैं अनुशंसा करता हूं कि आप थ्रेड-स्थानीय स्टोरेज पॉइंटर को स्थानीय चर में पहले कॉपी करें।

+2

आपने जवाब दिया है कि एक एप्लिकेशन डेवलपर टीएलएस कैसे कार्यान्वित कर सकता है लेकिन यह नहीं कि संकलक और लोडर C++ 0x thread_local कुंजी शब्द – doron

+6

को कैसे संभालता है @ डोरन: कंपाइलर और लोडर या तो ऑपरेटिंग सिस्टम प्रदान किए गए एपीआई का उपयोग करते हैं, या वे प्रोग्राम प्रोग्रामर के बिना किसी भी कोड को लिखने के बिना मैप तकनीक के बराबर कुछ करते हैं। – Doug

4

वैश्विक चर (या लिखने योग्य स्थिर डेटा - डब्लूएसडी) आमतौर पर ढेर, ढेर और कोड से अलग स्मृति ब्लॉक में संग्रहीत होते हैं। डब्ल्यूएसडी ब्लॉक बनाया गया है और निष्पादन योग्य कोड चलाने से पहले शुरू किया गया है।

सी ++ 0x thread_local कीवर्ड प्रस्तुत करता है जो सुनिश्चित करता है कि वैश्विक चर का एक अलग उदाहरण प्रति थ्रेड बनाया गया है। समस्या यह है कि प्रति थ्रेड को एक अलग ब्लॉक लोड करने की आवश्यकता है।

अगली कठिनाई यह है कि परिवर्तनीय का पता लिंक समय पर तय नहीं किया गया है और प्रत्येक थ्रेड के लिए अलग है।

इस मुद्दे के चार तरीके हैं। एक संकलक के लिए सही ब्लॉक प्राप्त करने के लिए एक फंक्शन कॉल उत्पन्न करना है जबकि दूसरा एबीआई को प्रोसेसर रजिस्टरों में से एक में टीएलएस ब्लॉक स्टोर करने के लिए बदलना है। इसके बाद सही thread_local चर का उपयोग करने के लिए ऑफ़सेट के साथ इसका उपयोग किया जा सकता है।

यह लाइब्रेरी समर्थन से अलग है जहां ओएस एक void* मान संग्रहीत करता है जिसे प्रोसेस ढेर पर आवंटित थ्रेड स्थानीय ब्लॉक में एक पॉइंटर स्टोर किया जा सकता है।

यदि आप चाहते हैं कि विवरण विवरण here देखें।

0

आप विभिन्न प्लेटफार्मों पर टीएलएस को पोर्टेबल रूप से संभालने के लिए boost::thread का उपयोग कर सकते हैं। प्रत्येक पर कार्यान्वयन कोड में है और आपको यह समझने में मदद करनी चाहिए कि इस क्षेत्र को कितनी अलग प्रणालियों को संभाला जाता है।

+1

सी ++ 0x में संकलक थ्रेड_लोकल कीवर्ड – doron

+0

के साथ टीएलएस का समर्थन करता है बूस्ट के जुर्माना का उपयोग करते हुए, लेकिन रिकॉर्ड के लिए कुछ कंपेलरों ने वास्तव में समस्या स्थान में खरीदा है। http://gcc.gnu.org/onlinedocs/gcc-3.3.1/gcc/Thread-Local.html –

+0

आप सही हैं, मैं इसे अपडेट कर दूंगा। –

संबंधित मुद्दे