2009-05-14 13 views
17

मैं 4 तर्क के रूप में एक संरचना गुजर जबकि कुछ इस तरह के साथ pthread_create() उपयोग करने की कोशिश या टीसी, मुझे एक त्रुटि मिल रही है - किसी सदस्य या संरचना में सदस्य के लिए अनुरोध।तर्कों के रूप पासिंग संरचनाओं pthread_create का उपयोग करते समय()

धागे में structs को पारित करने के लिए मैं किस वैकल्पिक विधि का उपयोग कर सकता हूं?

उत्तर

24

आप शायद pthread_create रूप में एक ही दायरे में संरचना का निर्माण कर रहे हैं। एक बार गुंजाइश निकलने के बाद यह संरचना मान्य नहीं होगी।

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

इसके अलावा, जैसा कि साइबरकॉन्टे ने उल्लेख किया है, यदि आप विभिन्न धागे से उस डेटा तक पहुंचने जा रहे हैं, तो आपको इसे म्यूटेक्स या महत्वपूर्ण अनुभाग से एक्सेस करना होगा।

संपादित कर सकते हैं 14 वीं, 2009 @ 12:19 PM EST: इसके अलावा, के रूप में अन्य लोगों का उल्लेख किया है, तो आप को सही प्रकार पर अपने पैरामीटर कास्ट करने के लिए किया है।

void my_thread_func(void* arg){ 
    my_struct foo = *((my_struct*)(arg)); /* Cast the void* to our struct type */ 
    /* Access foo.a, foo.b, foo.c, etc. here */ 
} 

या, यदि आप एक से गुजर रहे हैं:

आप एक ऐसा वैरिएबल एक वैश्विक संरचना (जो तुम पर जोर हो रहे हैं) है गुजर रहे हैं, तो अपने धागा समारोह प्रकार के कास्ट करने के लिए होगा आपकी संरचना के लिए सूचक:

void my_thread_func(void* arg){ 
    my_struct* foo = (my_struct*)arg; /* Cast the void* to our struct type */ 
    /* Access foo->a, foo->b, foo->c, etc. here */ 
} 
+0

दरअसल, मैंने मुख्य फ़ंक्शन में धागा बनाया और हेडर फ़ाइलों को शामिल करने के बाद संरचना को सही बनाया। तो यह सभी कार्यों द्वारा सुलभ होना चाहिए (अगर मैं गलत हूं तो मुझे सही करें)। – skinderneath

+0

आपका हालिया संपादन अब तक का सबसे उपयोगी पोस्ट था। धन्यवाद। – skinderneath

+1

धन्यवाद, यह मेरे बेकन को बचाया। – g33kz0r

0

आप साझा स्मृति या वैश्विक चर का उपयोग कर सकते हैं, (यदि किसी और चीज को उस तर्क की आवश्यकता नहीं होगी) या एक लिंक्डलिस्ट है यदि ये डेटा हैं जो डेटा से बाहर हैं।

बस अपने चर को लॉक करना याद रखें जो थ्रेड-साझा किए जा रहे हैं।

वास्तविक अपमानजनक कोड के बिना, मैं आपको नहीं बता सकता कि आप अपने वर्तमान कार्यान्वयन में क्या गलत कर रहे हैं।

+0

नीचे वोट निकाला गया (इतना याद करने के लिए, कोहरे में खो नहीं है बताया जा रहा) बनाते हैं। –

2

यदि आप अपने थ्रेड फ़ंक्शन के अंदर हैं, तो आपके द्वारा पारित तर्क एक शून्य * है। इससे पहले कि आप इसे इस्तेमाल कर सकें, आपको इसे एक संरचना में डालना होगा।

void my_thread_func(void* arg){ 
    my_struct foo = (my_struct)(*arg); /* Cast the void* to our struct type */ 
    /* Access foo.a, foo.b, foo.c, etc. here */ 
} 
+0

मैंने ऐसा किया लेकिन अब मुझे एक "dereferencing 'शून्य *' सूचक" त्रुटि मिलती है। – skinderneath

+0

हार्पर लिखना था: my_struct foo = * (my_struct *) arg; या my_struct * foo = (my_struct *) arg; –

+0

इस विचार का इस्तेमाल किया और लिंडसे फर्ग्यूसन का संपादन पोस्ट किया गया - 14 मई 200 9 @ 12:19 अपराह्न ईएसटी। – skinderneath

0

यह त्रुटि संदेश का अर्थ है कि आप सूचक को संदर्भित नहीं कर रहे हैं।

आप "टा" के बजाय "टी> एक" की

 
[[email protected] ~]$ cat testitx.c 
struct x { 
     int a, b; 
}; 

int main(int argc, char *argv[]) 
{ 
     struct x y, *z; 

     z = &y; 
     z.a = 10; 
} 
[[email protected] ~]$ cc -c testitx.c 
testitx.c: In function `main': 
testitx.c:10: error: request for member `a' in something not a structure or union 
[[email protected] ~]$ 
+0

मदद नहीं करता है। मैंने हार्पर शेल्बी के समाधान का उपयोग "dereferencing 'शून्य *' सूचक" त्रुटि प्राप्त करने के लिए किया था। – skinderneath

0

मैं अक्सर अन्य उत्तर में दिए गए उन्हीं गलतियाँ करने के लिए इस्तेमाल किया, लेकिन अब मैं एक अलग दृष्टिकोण अपनाते हैं कि चाल कह रहे हैं थ्रेडिंग फ़ंक्शन से pthread_create कॉल में त्रुटि की संभावना।

मैं घोषणा और एक 'सामान्य' रास्ते में सूत्रण समारोह को परिभाषित:

void *ThreadFunction(sPARAMETERS *Params) { 

    // do my threading stuff... 

} 

और जब मैं pthread_create कहते हैं, मैं एक डाली उपयोग करने की आवश्यकता:

pthread_create(&ThreadId,0,(void*(*)(void*)) &ThreadFunction,&Params); 

मैं लगभग कभी नहीं भूल जाते हैं पैराम्स पर & का उपयोग करें, और संकलक दूसरी छोर पर किए गए किसी भी गलतियों का ख्याल रखेगा। कॉलबैक के लिए भी बहुत अच्छा काम करता है।

+0

तकनीकी रूप से बोलते हुए, यह अनिर्धारित व्यवहार है - हालांकि अधिकांश कंपाइलरों पर यह सामान्य संरचना पॉइंटर्स के लिए काम करेगा। C++ सदस्य फ़ंक्शन पॉइंटर्स के साथ इसे आज़माएं ... – bdonlan

+0

मुझे समझ में नहीं आता कि यह मेरी समस्या को हल करने में कैसे मदद करता है। जिन लोगों का आपने उपयोग किया है वे बहुत ही गुप्त हैं। – skinderneath

1
  1. एक सेमाफोर

  2. बनाएं एक और संरचना है कि आपके संरचना करने के लिए एक सूचक और सेमाफोर संभाल

  3. के होते हैं बनाएं इस नई संरचना के लिए एक सूचक पास pthread_create को

  4. में माता-पिता धागा, यानी कि pthread_create कहा जाता है, सेमाफोर पर इंतजार

  5. बच्चे धागा में, स्थानीय चर करने के लिए अपने संरचना के सदस्यों की प्रतिलिपि बनाने या उन्हें कहीं और सहेजें

  6. बच्चे धागा में, सेमाफोर

  7. माता पिता धागा में संकेत, सेमाफोर

0
बंद

my_struct foo = (my_struct) (* arg); incoreect कोशिश my_struct * foo = (my_struct *) (आर्ग) है;
और, धागा कॉलिंग समारोह int, यकीन है कि इसके स्थिर जवाब के विस्तार के कारण

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