2012-08-09 18 views
15

मुझे एक ही प्रक्रिया में मुख्य धागे और अन्य थ्रेड के बारे में समस्या है। जब मुख्य समारोह वापस आता है, तो अन्य धागा भी बाहर निकलता है? मुझे कुछ भ्रमित है। और मैं कुछ टेस्ट कोड लिखता हूं, जैसे:मुख्य धागा निकास, क्या अन्य निकास भी करता है?

void* test1(void *arg) 
{ 
    unsigned int i = 0; 
    while (1){ 
     i+=1; 
    } 
    return NULL; 
} 

void* test2(void *arg) 
{ 
    long double i = 1.0; 
    while (1){ 
     i *= 1.1; 
    } 
    return NULL; 
} 

void startThread (void * (*run)(void*), void *arg) { 
    pthread_t t; 
    pthread_attr_t attr; 
    if (pthread_attr_init(&attr) != 0 
     || pthread_create(&t, &attr, run, arg) != 0 
     || pthread_attr_destroy(&attr) != 0 
     || pthread_detach(t) != 0) { 
    printf("Unable to launch a thread\n"); 
    exit(1); 
    } 
} 

int main() 
{ 
    startThread(test1, NULL); 
    startThread(test2, NULL); 

    sleep(4); 
    printf("main thread return.\n"); 

    return 0; 
} 

जब "मुख्य धागा वापसी"। बाहर निकालें, थ्रेड test1 और test2 भी बाहर निकलें, कोई मुझे बता सकता है क्यों?

+0

प्रश्न का पाठ प्रश्न निकाय से मेल नहीं खाता है। क्या यह मुख्य होता है जब मुख्य धागा निकलता है? या यह तब होता है जब मुख्य धागा 'मुख्य' फ़ंक्शन से वापस आता है? (जाहिर है, अगर यह निकलता है तो थ्रेड वापस नहीं आ सकता है। यह एक या दूसरे को कर सकता है।) –

उत्तर

9

जब मुख्य धागा लौटाता है, तो यह पूरी प्रक्रिया को समाप्त कर देता है। इसमें अन्य सभी धागे शामिल हैं। वही बात होती है जब आप exit पर कॉल करते हैं।

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

+16

लिखित के रूप में यह उत्तर सही नहीं है। जब मुख्य धागा (या कोई धागा) 'निकास' कहता है, या जब 'मुख्य' रिटर्न का आरंभिक आमंत्रण, पूरी प्रक्रिया निकलती है। लेकिन मुख्य धागा अन्य धागे को प्रभावित किए बिना 'pthread_exit' से बाहर निकल सकता है। –

19

आपको प्रत्येक नए धागे पर pthread_join() का उपयोग करना चाहिए, कॉलिंग थ्रेड को सब-थ्रेड पर प्रतीक्षा करने, निष्पादन को निलंबित करने और प्रक्रिया को बाहर निकालने के लिए सूचित करना चाहिए - जब तक कि उन धागे समाप्त नहीं हो जाते।

बनाए गए धागे पर pthread_detach पर कॉलिंग प्रक्रिया समाप्त होने के बाद उन्हें चारों ओर रखेगी। लिनक्स man page से:

पृथक विशेषता केवल थ्रेड समाप्त होने पर सिस्टम के व्यवहार को निर्धारित करती है; यह थ्रेड को समाप्त होने से नहीं रोकता है अगर प्रक्रिया निकास (3) (या समकक्ष, मुख्य थ्रेड रिटर्न) का उपयोग करके समाप्त हो जाती है।

आप कभी कभी एक main स्पष्ट pthread_join कॉल के स्थान पर प्रयोग में pthread_exit देखेंगे, आशय जा रहा है कि इस तरह से main बाहर निकलने अन्य थ्रेड निरंतर चलाने के लिए अनुमति देगा। वास्तव में, linux man page राज्यों को स्पष्ट रूप से इस:

अन्य धागे निष्पादन जारी रखने के लिए अनुमति देने के लिए, मुख्य थ्रेड pthread_exit फोन करके समाप्त करना चाहिए() के बजाय बाहर निकलने से (3)।

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

pthread_join, लक्ष्य थ्रेड के लिए pthread_t की आवश्यकता है। तो आप इसे startThread में कॉल नहीं कर सकते हैं। आपको pthread_t वापस करने की आवश्यकता होगी, या अपने startThread फ़ंक्शन पर pthread_t पर पॉइंटर पास करना होगा।

+1

लेकिन मैं इससे बचने के लिए pthread_detach फ़ंक्शन का उपयोग करता हूं। – laifjei

+2

ध्यान से ['pthread_detach'] (http://pubs.opengroup.org/onlinepubs/7908799/xsh/pthread_detach.html) के लिए दस्तावेज़ पढ़ें। यह ऐसा नहीं करता जो आपको लगता है। – pb2q

+0

@laifjei हो सकता है कि आप प्रदान की गई कार्यक्षमता से अलग हो जाएं। जी। जावा/सी #/पायथन/आदि में। - डेमन धागे। जावा आंतरिक रूप से प्रक्रिया को जीवित रखता है जबकि किसी भी गैर-डिमन धागे जीवित रहते हैं (भले ही मुख्य धागा मर जाता है)। –

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