2011-05-18 15 views
12

हाल ही में, मैं इस धारणा के तहत था कि यदि आप इसे फैलाने के बाद धागे को "अलग" करते हैं, तो थ्रेड "मुख्य" थ्रेड समाप्त होने के बाद भी रहता है।pthread_detach प्रश्न

लेकिन थोड़ा सा प्रयोग (नीचे सूचीबद्ध) मेरी धारणा के विपरीत चला जाता है। मुझे उम्मीद है कि पृथक धागा मुख्य समाप्त होने के बाद भी "अलग धागे से बोलना" प्रिंटिंग जारी रखेगा, लेकिन ऐसा प्रतीत नहीं होता है। आवेदन स्पष्ट रूप से समाप्त हो जाता है ...

"अलग" मुद्दों के बाद "अलग" धागे मर जाते हैं वापसी 0?

#include <pthread.h> 
#include <stdio.h> 

void *func(void *data) 
{ 
    while (1) 
    { 
     printf("Speaking from the detached thread...\n"); 
     sleep(5); 
    } 
    pthread_exit(NULL); 
} 

int main() 
{ 
    pthread_t handle; 
    if (!pthread_create(&handle, NULL, func, NULL)) 
    { 
     printf("Thread create successfully !!!\n"); 
     if (! pthread_detach(handle)) 
      printf("Thread detached successfully !!!\n"); 
    } 

    sleep(5); 
    printf("Main thread dying...\n"); 
    return 0; 
} 
+3

अन्य धागे चलने के दौरान मुख्य धागे से बाहर निकलना अच्छा नहीं है; किसी भी मामले में, मुख्य() से लौटने से अन्य थ्रेडों को वैसे भी मार दिया जाएगा। – MarkR

उत्तर

24

के शब्दों में Linux Programmer's Manual:

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

इसके अलावा Linux Programmer's Manual से

:

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

+0

क्या प्रक्रिया समाप्त हो जाएगी यदि मुख्य() वापसी 0 (या समकक्ष) pthread_exit (NULL) कहता है? यह प्रक्रिया का एक और धागा है ... – puffadder

+2

@puffadder: (1) मुख्य धागा "बस एक और धागा" नहीं है: वहां कुछ ऐसे मामले हैं जहां pthreads मुख्य धागे को अन्य धागे से अलग तरीके से मानते हैं; (2) 'वापसी 0' और' pthread_exit() 'बराबर नहीं हैं; मैंने अपना जवाब बढ़ाया है। – NPE

+0

आह! वहां आप जाते हैं ... मैंने कभी एक बार पढ़ा है कि pthread_exit() और वापसी धागे के लिए समान हैं ... और यही कारण है कि सभी भ्रम !!! स्पष्टीकरण के लिए बहुत बहुत धन्यवाद। – puffadder

13

pthread_detach बस इसका मतलब है कि आप कभी भी थ्रेड के साथ शामिल नहीं होने जा रहे हैं। यह थ्रेड थ्रेड (अलग केस) के बाद या थ्रेड पर pthread_join पर कॉल करने के बाद इसे थ्रेड संसाधनों को तत्काल निपटाने की अनुमति देता है या नहीं।

एक बार मुख्य रिटर्न (या निकास) ओएस आपके सभी धागे काट देगा और आपकी प्रक्रिया को नष्ट कर देगा।

1

हां, पृथक धागे return 0 के बाद मर जाएंगे।

man pthread_detach

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

3

pthread_detach आप क्या सोचते हैं यह करता है नहीं करता है - यह कार्यान्वयन को इंगित करता है कि निर्दिष्ट आईडी के साथ थ्रेड स्थान का उपयोग कर समाप्त होने पर ही पुनः प्राप्त किया जा सकता है, यानी। इस पर कोई pthread_join ऑपरेशन नहीं किया जाएगा।

एक बार प्रक्रिया को समाप्त करने के बाद सभी धागे समाप्त हो जाते हैं।

0

man pthread_detach से:

pthread_detach() समारोह के रूप में अलग धागा धागा द्वारा की पहचान के निशान। जब एक अलग थ्रेड समाप्त हो जाता है, तो इसके संसाधन स्वचालित रूप से सिस्टम में वापस जारी किए जाते हैं, बिना किसी थ्रेड के साथ किसी अन्य धागे की आवश्यकता के।

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