2011-12-15 8 views
35

मुझे सी concurrency प्रोग्रामिंग के बारे में एक सवाल है।pthread_join() और pthread_exit()

pthread लाइब्रेरी में, pthread_join के प्रोटोटाइप

int pthread_join(pthread_t tid, void **ret); 

है और pthread_exit के प्रोटोटाइप है:

void pthread_exit(void *ret); 

तो मैं उलझन में हूँ कि, क्यों pthread_join प्रक्रिया के रिटर्न मान लेता है रीपैड थ्रेड से void पॉइंटर के पॉइंटर के रूप में, लेकिन pthread_exit केवल मौजूदा थ्रेड से void पॉइंटर लेता है? मेरा मतलब है कि मूल रूप से वे सभी धागे से मूल्य वापस कर रहे हैं, प्रकार में कोई अंतर क्यों है?

उत्तर

32

है pthread_exit में, ret एक इनपुट पैरामीटर है। आप बस कार्य करने के लिए एक चर के पते को पारित कर रहे हैं।

pthread_join में, ret एक आउटपुट पैरामीटर है। आप फ़ंक्शन से मूल्य वापस लेते हैं। इस तरह का मान, उदाहरण के लिए, NULL पर सेट किया जा सकता है।

लांग स्पष्टीकरण:

pthread_join में, आप पता समाप्त धागा द्वारा pthread_exit के लिए पारित वापस मिलता है। यदि आप केवल एक सादा सूचक पास करते हैं, तो यह मूल्य से गुजरता है ताकि आप यह कहां बदल सकें कि यह कहां इंगित कर रहा है। Pthread_join को पास किए गए पॉइंटर के मान को बदलने में सक्षम होने के लिए, इसे पॉइंटर के रूप में पास किया जाना चाहिए, यानी पॉइंटर के लिए पॉइंटर।

+0

लेकिन क्यों परिभाषित 'में सेवानिवृत्त pthread_exit' एक' शून्य * 'प्रकार, it'a हमेशा' NULL' या कुछ अन्य निरंतर मूल्यों – stonestrong

3

विशिष्ट प्रयोग

void* ret = NULL; 
pthread_t tid = something; /// change it suitably 
if (pthread_join (tid, &ret)) 
    handle_error(); 
// do something with the return value ret 
25

यह क्योंकि हर बार

void pthread_exit(void *ret); 

धागा समारोह इसलिए जो कभी आप बस pthread_exit के साथ अपने सूचक पास वापस जाने के लिए() चाहते से बुलाया जाएगा।

अब

पर
int pthread_join(pthread_t tid, void **ret); 

हमेशा जहां धागा इसलिए यहाँ स्वीकार करने के लिए है कि सूचक लौटे बनाई गई है से कहा जाएगा आप डबल सूचक ..

मैं इस कोड की मदद से आप को समझने के लिए लगता है की जरूरत है इस

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

void* thread_function(void) 
{ 
    char *a = malloc(10); 
    strcpy(a,"hello world"); 
    pthread_exit((void*)a); 
} 
int main() 
{ 
    pthread_t thread_id; 
    char *b; 

    pthread_create (&thread_id, NULL,&thread_function, NULL); 

    pthread_join(thread_id,(void**)&b); //here we are reciving one pointer 
             value so to use that we need double pointer 
    printf("b is %s",b); 
    free(b); // lets free the memory 

} 
+5

स्मृति रिसाव .... – gliderkite

+0

इस मामले में कैसे मुक्त करें? या इस तरह मेमोरी रिसाव से कैसे बचें? – ponypaver

+0

'मुफ्त (बी);' प्रिंटफ के ठीक बाद ("बी% s" है, बी); 'अगर मुझे गलत नहीं लगता है। –