मुझे एक फ़ंक्शन में एकाधिक तर्क पारित करने की आवश्यकता है जिसे मैं एक अलग थ्रेड पर कॉल करना चाहता हूं। मेरे पास 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
किसी को भी पता है मैं क्या गलत कर रहा हूँ?
ढेर पर आवंटित की कोशिश? –
@ करसन क्यों इससे कोई फर्क पड़ता है? – sigjuice
आपकी संरचना कम से कम आपके धागे तक रहनी चाहिए। यदि आप थ्रेड बना रहे हैं और उस फ़ंक्शन से लौट रहे हैं जिसे pthread_create() कहा जाता है, तो स्टैक पर आवंटित संरचना अन्य डेटा द्वारा अधिलेखित हो सकती है और आपके थ्रेड फ़ंक्शन में समस्याएं पैदा कर सकती है। इस उदाहरण में, यह कोई समस्या नहीं है, क्योंकि निर्माण धागा कार्यकर्ता धागे को लौटने से पहले पूरा करने की प्रतीक्षा करता है। –