2010-01-18 12 views

उत्तर

50

पहले दुकान धागा आईडी

pthread_create(&thr, ...) 

फिर बाद में

pthread_cancel(thr) 
हालांकि

, यह एक सिफारिश की प्रोग्रामिंग अभ्यास कहते हैं! थ्रेड को संवाद करने के लिए सेमफोर या संदेश जैसे इंटर-थ्रेड संचार तंत्र का उपयोग करना बेहतर है कि इसे निष्पादन को रोकना चाहिए।

ध्यान दें कि pthread_kill (...) वास्तव में प्राप्त करने वाले धागे को समाप्त नहीं करता है, बल्कि इसके लिए एक संकेत प्रदान करता है, और यह सिग्नल और सिग्नल हैंडलर पर निर्भर करता है कि क्या होता है।

+4

pthread_cancel, btw के साथ समस्या यह है कि यदि आप इसका उपयोग करते हैं, तो रद्द किए गए थ्रेड में चल रहे कोड को रद्दीकरण बिंदुओं को समझना है, और यह सुनिश्चित करना है कि (ए) यह अक्सर एक बार हिट करता है कि वास्तव में यह अच्छा हो जाता है समय, और (बी) यह होता है जब यह संसाधनों को रिसाव नहीं करता है। यह एक तरह का मुश्किल है, जबकि यदि आप एक संदेश का उपयोग करते हैं, तो यह आपके कोड में बिल्कुल स्पष्ट है जब थ्रेड बाहर निकल सकता है। –

+11

@Steve: दुर्भाग्य से, 'pthread_cancel' लाइब्रेरी कोड * में एकमात्र साफ तरीका है * एक थ्रेड को बाधित करने के लिए जो सिस्कोल पर अवरुद्ध हो सकता है। दूसरी विधि एक इंटरप्टिंग सिग्नल हैंडलर स्थापित करना है और सुनिश्चित करें कि आपका सभी कोड 'EINTR' से निपटने के लिए तैयार है, लेकिन लाइब्रेरी कोड यह नहीं मान सकता कि इसे सिग्नल हैंडलिंग बदलने या कॉलर पर 'EINTR' हैंडलिंग को लागू करने का अधिकार है। –

2

pthread_kill() फ़ंक्शन पर एक नज़र डालें।

+2

यह किसी भी धागे को मारता नहीं है, यह सिर्फ एक सिग्नल भेजता है। – alk

5

मैं एंटी से सहमत हूं, बेहतर अभ्यास कुछ चेकपॉइंट्स को लागू करना होगा जहां थ्रेड जांचता है कि इसे समाप्त करना चाहिए या नहीं। इन चेकपॉइंट्स को कई तरीकों से कार्यान्वित किया जा सकता है जैसे कि: लॉक के साथ एक साझा चर या एक ऐसा थ्रेड जो थ्रेड चेक करता है यदि यह सेट हो (थ्रेड शून्य समय का इंतजार कर सकता है)।

18

इस समस्या के दो दृष्टिकोण हैं।

  • एक संकेत का उपयोग करें: धागा जो एक ध्वज सेट sigaction() का उपयोग कर एक संकेत हैंडलर स्थापित करता है, और धागा समय-समय पर ध्वज की जाँच करता है यह देखने के लिए कि क्या यह समाप्त करना होगा। जब धागा को समाप्त करना होगा, pthread_kill() का उपयोग करके इसे सिग्नल जारी करें और pthread_join() के साथ इसकी समाप्ति की प्रतीक्षा करें। इस दृष्टिकोण को पैरेंट थ्रेड और बाल थ्रेड के बीच प्री-सिंक्रनाइज़ेशन की आवश्यकता है, यह गारंटी देने के लिए कि बच्चे थ्रेड पहले ही सिग्नल हैंडलर स्थापित कर चुका है, इससे पहले कि यह समाप्ति संकेत को संभालने में सक्षम हो;
  • रद्दीकरण बिंदु का उपयोग करें: जब भी रद्दीकरण कार्य निष्पादित किया जाता है तो धागा समाप्त हो जाता है। जब थ्रेड को समाप्त करना होगा, pthread_cancel() निष्पादित करें और pthread_join() के साथ इसकी समाप्ति की प्रतीक्षा करें। संसाधन रिसाव से बचने के लिए इस दृष्टिकोण के लिए pthread_cleanup_push() और pthread_cleanup_pop() के विस्तृत उपयोग की आवश्यकता है। ये अंतिम दो कॉल कोड के अक्षीय दायरे से गड़बड़ कर सकती हैं (क्योंकि वे मैक्रोज़ { और } टोकन उपज कर सकते हैं) और ठीक से बनाए रखना बहुत मुश्किल है।

(ध्यान दें कि यदि आप पहले से ही धागा pthread_detach() का उपयोग कर अलग है, तो आप फिर से pthread_join() का उपयोग कर इसे शामिल नहीं हो सकते।)

दोनों दृष्टिकोण बहुत मुश्किल हो सकता है, लेकिन या तो किसी परिस्थिति में विशेष रूप से उपयोगी हो सकता है।

0
pthread_exit(0) 

यह धागे को मार देगा।

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