2010-03-17 17 views
22
__thread Foo foo; 

"foo" वास्तव में कैसे हल किया जाता है? क्या संकलक चुपचाप फ़ंक्शन कॉल के साथ "foo" के प्रत्येक इंस्टेंस को प्रतिस्थापित करता है? क्या "foo" स्टैक के निचले हिस्से के सापेक्ष कहीं भी संग्रहीत है, और संकलक इसे "हे, प्रत्येक थ्रेड के लिए स्टोर करता है, इस स्थान को ढेर के नीचे के पास है, और foo को 'स्टैक के नीचे से ऑफसेट एक्स' के रूप में संग्रहीत किया जाता है। "?लिनक्स के धागे स्थानीय भंडारण कार्यान्वयन

उत्तर

26

यह थोड़ा जटिल है (this document इसे बहुत विस्तार से समझाता है), लेकिन यह मूल रूप से न तो है। इसके बजाय संकलक निष्पादन योग्य में एक विशेष .tdata अनुभाग डालता है, जिसमें सभी थ्रेड-स्थानीय चर शामिल होते हैं। रनटाइम पर, प्रत्येक धागे के लिए एक नया डेटा खंड (केवल पढ़ने के लिए) .tdata अनुभाग में डेटा की एक प्रति के साथ बनाया जाता है, और जब रनटाइम पर धागे स्विच किए जाते हैं, तो अनुभाग स्वचालित रूप से भी स्विच हो जाता है।

अंत परिणाम यह है कि __thread चर नियमित रूप से चर के रूप में तेज़ होते हैं, और वे अतिरिक्त स्टैक स्पेस नहीं लेते हैं।

+0

मैं देख सकता हूं कि यह कैसे काम करता है यदि मेरे पास बहु धागे हैं लेकिन केवल एक कोर है। जब मेरे पास बहु धागे और बहु ​​कोर होते हैं, तो यह .tdata अनुभाग कैसे काम करता है? – anon

+0

@anon: आप अपने दूसरे मामले में क्या अंतर देखते हैं? –

+0

समय 01: कोर 1 रन 1 धागा; थ्रेड 1 के। swata में स्वैप; समय 02: कोर 2 रन 2 धागा; थ्रेड 2 के। swata में स्वैप; अब थ्रेड 1 का उपयोग थ्रेड 2 का उपयोग नहीं कर रहा है .tdata? – anon

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