2011-08-19 11 views
5

कार्य पर काम कर रहे कई धागे हैं। एक बार थ्रेड सफल होने के बाद सभी धागे को रद्द कर दिया जाना चाहिए, क्योंकि काम पूरा हो गया है। एक धागा सफलतापूर्वक समाप्त हो जाने पर मैं अन्य धागे को कैसे रद्द कर सकता हूं? pthread_cancel() कौन कॉल करेगा और सफल धागा main या थ्रेड जो इसे उत्पन्न करता है (वापसी मूल्य?) कैसे बताएगा।एक सामान्य काम के बाद POSIX धागा रद्द करें

अद्यतन

मैं बस exit कॉल करने के लिए के रूप में मैं अब कुछ नियंत्रण चाहते हैं नहीं करना चाहती। उदाहरण के लिए धागे रद्द होने के बाद, मैं सफल थ्रेड द्वारा पाए गए परिणाम को संसाधित करूंगा और संभवतः कुछ और प्रोसेसिंग कर सकता हूं, या बस प्रक्रिया को कुछ और काम के लिए चलाना चाहता हूं।

+0

यदि आप सभी के द्वारा किए गए काम को फेंकने जा रहे हैं, तो आपको इस कार्य के लिए कई धागे की आवश्यकता क्यों है? बस एक धागे में एक बार काम करते हैं। – zwol

+2

कहता है, मेरे पास रैखिक रूप से खोजने के लिए एक बड़ी सूची है, मैं अलग-अलग धागे में सूचियों के सेगमेंट पास कर दूंगा, और एक बार एक मैच मिल जाए, रिटर्न। अन्य रद्द कर दिए गए हैं। – phoxis

+0

मुझे लगता है कि एक संदर्भ में समझ में आता है जहां एक ब्रूट-फोर्स सर्च एकमात्र विकल्प है, लेकिन यदि आपके डेटा में कोई संरचना है, तो बेहतर एल्गोरिदम हैं। – zwol

उत्तर

4

आप एक साधारण योजना चुन सकते हैं जहां मुख्य सब कुछ करता है।

main सभी धागे शुरू करें और कुछ सेमफोर पर down करें। जब कोई धागा कार्य को समाप्त करता है, तो उस सेमफोर पर up करें। जब मुख्य अनलॉक किया जाता है तो यह सुनिश्चित करने के लिए pthread_cancel सभी थ्रेड (और फिर pthread_join) कर सकते हैं।

इस तरह main सभी थ्रेड शुरू करता है और बंद करता है, इसलिए यह बहुत आसान होना चाहिए।

+0

हां, मेरा डिजाइन मुख्य आधार पर है और यह एक अच्छा विचार है। सिग्नल के साथ कुछ भी किया जा सकता है? – phoxis

+0

@phoxis सुनिश्चित करने के लिए, आप 'pthread_kill' का उपयोग करके थ्रेड को सिग्नल भेज सकते हैं। अभी भी इस नियम में मुझे लगता है कि यह गन्दा होगा (मैं सिग्नल हैंडलर से धागे को छोड़ने का एक आसान तरीका नहीं सोच सकता)। लेकिन इसके लिए मेरा शब्द न लें, मैं हमेशा सिग्नल से दूर शर्मिंदा हूं। मुख्य स्पॉन्गिंग बच्चों के मामले में – cnicutar

+0

, मुझे म्यूटेक्स समाधान पसंद है, और मैं इसका उपयोग करूंगा। मैंने सिग्नल के बारे में पूछा जब यह मामला है कि धागे किसी भी सामान्य माता-पिता के बिना रिकर्सिव या यादृच्छिक रूप से पैदा किए जा रहे हैं, उस मामले में सिग्नल काम कर सकते हैं। या ऐसे यादृच्छिक स्पॉन्गिंग को रद्द करने का कोई अन्य तरीका है? – phoxis

1

एक आसान तरीका exit() पर कॉल करना है जो सभी धागे के साथ प्रक्रिया को समाप्त करता है। इसे किसी भी धागे से बुलाया जा सकता है।

एक और तरीका है अपने मुख्य थ्रेड अंडे है और कार्यकर्ता धागे पर प्रतीक्षा करने के लिए है, और एक बार कार्यकर्ता धागे में से एक पूरा कर लिया है या तो:

  • अच्छी तरह से अन्य थ्रेड समाप्त कर देंगे और तक इंतजार वे करते नहीं कहेंगे, या
  • अचानक pthread_cancel() उन्हें। डिफ़ॉल्ट धागे द्वारा PTHREAD_CANCEL_DEFERRED के साथ बनाया गया है, जिसका अर्थ है कि वे किसी भी रद्दीकरण बिंदु कार्यों को कॉल करने तक समाप्त नहीं होंगे, Thread Cancellation को एक अच्छे विवरण के लिए देखें। इसलिए, यदि आप थ्रेड कुछ लंबी गणना कर रहे हैं तो आप तुरंत रद्दीकरण को समाप्त करने के लिए PTHREAD_CANCEL_ASYNCHRONOUS पर अपनी रद्दीकरण स्थिति सेट करना चाहेंगे, pthread_setcanceltype देखें।
+0

हां, यह एक तरीका है जिसे मैं इसे पोस्ट करने से पहले उपयोग कर रहा था, लेकिन अब मुझे कुछ और नियंत्रण चाहिए। उदाहरण के लिए धागे रद्द होने के बाद, मैं सफल धागे द्वारा पाए गए परिणाम को संसाधित करूंगा और संभवतः कुछ और प्रोसेसिंग कर सकता हूं। – phoxis

+0

फिर अद्यतन देखें :) –

+0

सिग्नल के साथ कुछ भी किया जा सकता है? – phoxis

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