2009-08-30 9 views
65

मुझे एक फ़ंक्शन में एकाधिक तर्क पारित करने की आवश्यकता है जिसे मैं एक अलग थ्रेड पर कॉल करना चाहता हूं। मेरे पास read है कि ऐसा करने का सामान्य तरीका एक संरचना को परिभाषित करना है, फ़ंक्शन को उस पर एक पॉइंटर पास करना है, और तर्कों के लिए इसे अस्वीकार करना है। हालांकि, मैं प्राप्त करने में असमर्थ हूँ यह काम करने के लिए:pthread_create() द्वारा बुलाए जाने वाले फ़ंक्शन के लिए एकाधिक तर्क?

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

struct arg_struct { 
    int arg1; 
    int arg2; 
}; 

void *print_the_arguments(void *arguments) 
{ 
    struct arg_struct *args = (struct arg_struct *)args; 
    printf("%d\n", args -> arg1); 
    printf("%d\n", args -> arg2); 
    pthread_exit(NULL); 
    return NULL; 
} 

int main() 
{ 
    pthread_t some_thread; 
    struct arg_struct args; 
    args.arg1 = 5; 
    args.arg2 = 7; 

    if (pthread_create(&some_thread, NULL, &print_the_arguments, (void *)&args) != 0) { 
     printf("Uh-oh!\n"); 
     return -1; 
    } 

    return pthread_join(some_thread, NULL); /* Wait until thread is finished */ 
} 

इस के लिए उत्पादन किया जाना चाहिए:

5 
7 

लेकिन जब मैं इसे चलाने मैं वास्तव में मिलती है:

141921115 
-1947974263 

किसी को भी पता है मैं क्या गलत कर रहा हूँ?

+1

ढेर पर आवंटित की कोशिश? –

+1

@ करसन क्यों इससे कोई फर्क पड़ता है? – sigjuice

+5

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

उत्तर

58

क्योंकि तुम कहते हो

struct arg_struct *args = (struct arg_struct *)args;

बजाय

struct arg_struct *args = arguments;

+0

वाह। ओह। धन्यवाद। – Michael

+2

मुझे आश्चर्य है कि यह पहली जगह सफलतापूर्वक संकलित कैसे हुआ ... –

+2

@ सिगुजू, यह मेरे लिए काम नहीं करता है। मैं संकलन त्रुटि देखता हूं: 'void *' से 'arg_struct *' में अमान्य रूपांतरण। – Neshta

4

main() यह खुद धागा है और चर ढेर हो गया है। या तो ढेर में 'आर्ग' के लिए स्मृति को आबंटित या यह वैश्विक बनाने:

struct arg_struct { 
    int arg1; 
    int arg2; 
}args; 

//declares args as global out of main() 

तो निश्चित रूप से संदर्भ args->arg1 से args.arg1 आदि को बदलने ..

15

उपयोग

struct arg_struct *args = (struct arg_struct *)arguments; 

के स्थान पर

struct arg_struct *args = (struct arg_struct *)args; 
2

उपयोग:

struct arg_struct *args = malloc(sizeof(struct arg_struct)); 

और पारित इस तरह इस तर्क:

pthread_create(&tr, NULL, print_the_arguments, (void *)args); 

मुक्त आर्ग मत भूलना! ;)

0

print_the_arguments की आर्ग, तर्क है, इसलिए आप उपयोग करना चाहिए:

struct arg_struct *args = (struct arg_struct *)arguments. 
संबंधित मुद्दे

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