मैं pthread_create(&thread1, &attrs, //... , //...);
का उपयोग करता हूं और यदि किसी शर्त को इस धागे को मारने की आवश्यकता है तो इसे कैसे मारना है?पर्थ्रेड लाइब्रेरी में थ्रेड को मारें
उत्तर
पहले दुकान धागा आईडी
pthread_create(&thr, ...)
फिर बाद में
pthread_cancel(thr)
हालांकि
, यह एक सिफारिश की प्रोग्रामिंग अभ्यास कहते हैं! थ्रेड को संवाद करने के लिए सेमफोर या संदेश जैसे इंटर-थ्रेड संचार तंत्र का उपयोग करना बेहतर है कि इसे निष्पादन को रोकना चाहिए।
ध्यान दें कि pthread_kill (...) वास्तव में प्राप्त करने वाले धागे को समाप्त नहीं करता है, बल्कि इसके लिए एक संकेत प्रदान करता है, और यह सिग्नल और सिग्नल हैंडलर पर निर्भर करता है कि क्या होता है।
pthread_kill()
फ़ंक्शन पर एक नज़र डालें।
यह किसी भी धागे को मारता नहीं है, यह सिर्फ एक सिग्नल भेजता है। – alk
मैं एंटी से सहमत हूं, बेहतर अभ्यास कुछ चेकपॉइंट्स को लागू करना होगा जहां थ्रेड जांचता है कि इसे समाप्त करना चाहिए या नहीं। इन चेकपॉइंट्स को कई तरीकों से कार्यान्वित किया जा सकता है जैसे कि: लॉक के साथ एक साझा चर या एक ऐसा थ्रेड जो थ्रेड चेक करता है यदि यह सेट हो (थ्रेड शून्य समय का इंतजार कर सकता है)।
इस समस्या के दो दृष्टिकोण हैं।
- एक संकेत का उपयोग करें: धागा जो एक ध्वज सेट
sigaction()
का उपयोग कर एक संकेत हैंडलर स्थापित करता है, और धागा समय-समय पर ध्वज की जाँच करता है यह देखने के लिए कि क्या यह समाप्त करना होगा। जब धागा को समाप्त करना होगा,pthread_kill()
का उपयोग करके इसे सिग्नल जारी करें औरpthread_join()
के साथ इसकी समाप्ति की प्रतीक्षा करें। इस दृष्टिकोण को पैरेंट थ्रेड और बाल थ्रेड के बीच प्री-सिंक्रनाइज़ेशन की आवश्यकता है, यह गारंटी देने के लिए कि बच्चे थ्रेड पहले ही सिग्नल हैंडलर स्थापित कर चुका है, इससे पहले कि यह समाप्ति संकेत को संभालने में सक्षम हो; - रद्दीकरण बिंदु का उपयोग करें: जब भी रद्दीकरण कार्य निष्पादित किया जाता है तो धागा समाप्त हो जाता है। जब थ्रेड को समाप्त करना होगा,
pthread_cancel()
निष्पादित करें औरpthread_join()
के साथ इसकी समाप्ति की प्रतीक्षा करें। संसाधन रिसाव से बचने के लिए इस दृष्टिकोण के लिएpthread_cleanup_push()
औरpthread_cleanup_pop()
के विस्तृत उपयोग की आवश्यकता है। ये अंतिम दो कॉल कोड के अक्षीय दायरे से गड़बड़ कर सकती हैं (क्योंकि वे मैक्रोज़{
और}
टोकन उपज कर सकते हैं) और ठीक से बनाए रखना बहुत मुश्किल है।
(ध्यान दें कि यदि आप पहले से ही धागा pthread_detach()
का उपयोग कर अलग है, तो आप फिर से pthread_join()
का उपयोग कर इसे शामिल नहीं हो सकते।)
दोनों दृष्टिकोण बहुत मुश्किल हो सकता है, लेकिन या तो किसी परिस्थिति में विशेष रूप से उपयोगी हो सकता है।
pthread_exit(0)
यह धागे को मार देगा।
- 1. बूस्ट थ्रेड लाइब्रेरी या पर्थ्रेड में प्रमुख अंतर क्या हैं?
- 2. एमएफसी थ्रेड को कैसे मारें?
- 3. सी # थ्रेड को कैसे मारें?
- 4. पृष्ठभूमि PHP थ्रेड को कैसे मारें?
- 5. एक चल रहे थ्रेड को बाधित/मारें
- 6. पर्थ्रेड प्राथमिकता
- 7. तुरंत सी # में धागे को कैसे मारें?
- 8. पर्थ्रेड और प्रतीक्षा की शर्तें
- 9. एनएसटीएचएड वीएस पर्थ्रेड
- 10. आर में प्लॉटिंग प्रक्रिया को कैसे मारें?
- 11. डेल्फी में धागे को कैसे मारें?
- 12. मैकोज़ में एक प्रक्रिया को कैसे मारें?
- 13. विंडोज में ग्लासफ़िश सर्वर को कैसे मारें?
- 14. पोर्टेबल क्लास लाइब्रेरी में थ्रेड कैसे बनाएं?
- 15. MySQL कनेक्शन को कैसे मारें
- 16. एक अजगर प्रक्रिया को मारें
- 17. सी # प्रक्रिया को कैसे मारें?
- 18. नोहुप प्रक्रिया को कैसे मारें?
- 19. बूस्ट थ्रेड रद्द करना
- 20. सामान्य लिस्प में मल्टी-थ्रेड को कार्यान्वित करने के लिए
- 21. VisualVM का उपयोग करके या यूनिक्स कमांड का उपयोग करके जावा थ्रेड को कैसे मारें?
- 22. सी # लाइब्रेरी में मुख्य थ्रेड में चलने का पता लगाना
- 23. पृष्ठभूमि PHP स्क्रिप्ट (साझा होस्टिंग) को मारें
- 24. एंड्रॉइड - लॉगआउट पर सभी गतिविधियों को मारें
- 25. एक लटका बाल प्रक्रिया को मारें
- 26. पुराने जेसनपी अनुरोध को कैसे मारें?
- 27. "उत्तरदायी स्क्रिप्ट" पर एक टैब को मारें
- 28. किसी तृतीय-पक्ष एप्लिकेशन को कैसे मारें?
- 29. अनबिंड - निकालें - एक jQuery प्लगइन को मारें
- 30. node.js पर खुली प्रक्रिया को कैसे मारें?
pthread_cancel, btw के साथ समस्या यह है कि यदि आप इसका उपयोग करते हैं, तो रद्द किए गए थ्रेड में चल रहे कोड को रद्दीकरण बिंदुओं को समझना है, और यह सुनिश्चित करना है कि (ए) यह अक्सर एक बार हिट करता है कि वास्तव में यह अच्छा हो जाता है समय, और (बी) यह होता है जब यह संसाधनों को रिसाव नहीं करता है। यह एक तरह का मुश्किल है, जबकि यदि आप एक संदेश का उपयोग करते हैं, तो यह आपके कोड में बिल्कुल स्पष्ट है जब थ्रेड बाहर निकल सकता है। –
@Steve: दुर्भाग्य से, 'pthread_cancel' लाइब्रेरी कोड * में एकमात्र साफ तरीका है * एक थ्रेड को बाधित करने के लिए जो सिस्कोल पर अवरुद्ध हो सकता है। दूसरी विधि एक इंटरप्टिंग सिग्नल हैंडलर स्थापित करना है और सुनिश्चित करें कि आपका सभी कोड 'EINTR' से निपटने के लिए तैयार है, लेकिन लाइब्रेरी कोड यह नहीं मान सकता कि इसे सिग्नल हैंडलिंग बदलने या कॉलर पर 'EINTR' हैंडलिंग को लागू करने का अधिकार है। –