c++ - पर्थ्रेड लाइब्रेरी में थ्रेड को मारो



multithreading pthreads (4)

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

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

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

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

https://src-bin.com

मैं pthread_create(&thread1, &attrs, //... , //...); और अगर किसी शर्त को इस धागे को मारने की जरूरत है तो इसे कैसे मारना चाहिए?


Answer #1

पहले थ्रेड आईडी स्टोर करें

pthread_create(&thr, ...)

फिर बाद में कॉल करें

pthread_cancel(thr)

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

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


Answer #2

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


Answer #3
pthread_exit(0) 

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





pthreads