2010-05-12 21 views
9

मैं थ्रेडिंग के लिए थोड़ा नया हूं, इसलिए आपको इस प्रश्न के naiveté को माफ करना होगा।pthread_join कैसे कार्यान्वित किया जाता है?

pthread_join कैसे लागू किया गया है और यह थ्रेड शेड्यूलिंग को कैसे प्रभावित करता है?

मैंने हमेशा pthread_join को थोड़ी देर के साथ कार्यान्वित किया, बस कॉलिंग थ्रेड को तब तक उत्पन्न करने का कारण बनता है जब तक लक्ष्य थ्रेड पूरा नहीं हो जाता। इस (बहुत अनुमानित स्यूडोकोड) की तरह:

 

atomic bool done; 

thread_run { 

    do_stuff(); 
    done = true; 

} 

thread_join { 

    while(!done) { 
     thread_yield(); 
    // basically, make the thread that calls "join" on 
    // our thread yield until our thread completes 
    } 
} 

यह एक सटीक चित्रण है, या मैं बेहद प्रक्रिया oversimplifying रहा हूँ?

चीयर्स!

उत्तर

3

हां यह सामान्य विचार है। किसी विशेष कार्यान्वयन के गोर विवरण के लिए glibc पर एक नज़र डालें।

+2

उसके कोड और वास्तविक कोड के बीच एकमात्र वास्तव में बड़ा अंतर यह है कि उसका कोड अतिरिक्त कोर होने पर सीपीयू के 100% को जलाने के लिए थ्रेडिंग थ्रेड का कारण बनता है। –

4

pthread_join शायद आंतरिक रूप से एक सेमफोर के इंतजार के रूप में कार्यान्वित किया जाता है जो थ्रेड निकलने पर ट्रिगर होता है, या तो जब यह pthread_exit को कॉल करता है या जब उसका मुख्य कार्य निकलता है।

किसी भी मामले में, glibc के लिए स्रोत कोड उपलब्ध है, गूगल कोड खोज का प्रयास करें (मैं वहाँ में कुछ जानकारीपूर्ण सामान देखा था)

+0

https://sourceware.org/git/?p=glibc.git;a=blob;f=nptl/pthread_join.c;h=6a87a8b329c3e34a57d65e86d45fa97a5fdb2fe2;hb=master#l89 उस रेखा के लिए जहां जादू होता है। – Benoit

1

एक धागा आम तौर पर एक छोटे से इसके साथ जुड़े संरचना, धागा संदर्भ है। उस संरचना को डेटा के सभी टुकड़ों से भरा जा सकता है जिन्हें थ्रेड "काम" बनाने के लिए आवश्यक है।

उदाहरण के लिए, उस थ्रेड के थ्रेड-विशिष्ट कुंजी तक पहुंचने के लिए आवश्यक डेटा संरचना की जड़, और इसे बंद करने के दौरान उन्हें साफ़ करने के लिए उन पर पुन: सक्रिय करने के लिए आवश्यक है।

आमतौर पर उस संरचना में एक म्यूटेक्स-लॉक लॉक होता है, और शायद अलग-अलग वर्गों के लिए एक से अधिक।

धागे संदर्भ में उसमें एक छोटा सा क्षेत्र हो सकता है जहां एक समाप्ति धागा अपनी निकास स्थिति रख सकता है। (void *pthread_exit द्वारा लौटाया गया है या थ्रेड फ़ंक्शन से लौटकर।)

थ्रेड संदर्भ थ्रेड के राज्य को इंगित कर सकता है (अभी तक नहीं बनाया गया है, चल रहा है, रोका गया है)।

एक सिंक्रनाइज़ेशन आदिम हो सकता है, जैसे एक कंडीशन वेरिएबल या सेमफोर, जो थ्रेड kick हो सकता है, समाप्ति की स्थिति तैयार करने के बाद और यह संकेत दे रहा है कि यह समाप्त हो रहा है।

pthread_join फ़ंक्शन उस सिंक्रनाइज़ेशन आदिम पर प्रतीक्षा कर सकता है। एक बार इंतजार समाप्त होने के बाद, कार्य स्थिति को खींचने के अलावा, फ़ंक्शन उस थ्रेड के लिए संसाधन को साफ़ कर सकता है।

धागा शामिल होने के संकेत के बाद निष्पादन जारी है। ऐसा करने के लिए इसे एक स्टैक के साथ एक संदर्भ जारी रखना चाहिए। उस बिंदु के बाद, सिस्टम को पृष्ठभूमि में थ्रेड को साफ करने की समस्या को हल करना होगा।

थ्रेडिंग का उपयोगकर्ता-स्थान कार्यान्वयन कर्नेल को रोक सकता है। जैसे कुछ संकेत बंद हो सकते हैं या जो कुछ भी इंगित करता है कि धागा समाप्त हो गया है। उस बिंदु पर, उपयोगकर्ता स्थान जानता है कि थ्रेड संभवतः अपने ढेर का उपयोग नहीं कर सकता है और इसे रीसायकल कर सकता है।

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

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