2011-05-31 9 views
11

में थ्रेड को मारने के लिए कैसे करें। नियंत्रण का उपयोग करना। कॉनक्यूरेंट और फोर्कियो कुछ ऐसे मामले हैं जो थ्रेड को अवरुद्ध स्थिति में छोड़ देंगे (यह विशेष रूप से नेटवर्किंग के साथ खिड़कियों के नीचे अक्सर होता है) ताकि अगर कोई हत्या का उपयोग करने का प्रयास करता है तो अपवाद कभी नहीं होता है धागे में उठाया। क्या धागे को मरने के लिए मजबूर करने का कोई और तरीका है?हास्केल

एक हेल्पर थ्रेड से निकास विफलता के साथ पूरे आवेदन को समाप्त करने का मेरा प्रयास इन शर्तों के तहत कोई प्रभाव नहीं पड़ता है।

शानदार ग्लासगो हास्केल संकलन प्रणाली, संस्करण 6.12.1 हिमाचल प्रदेश 2010.1.0.0

संपादित करें: चीजें स्पष्ट करने के लिए, मैं आवेदन समाप्त करने के लिए नहीं करना चाहते हैं, मैं सिर्फ धागा को मारने के लिए पसंद करेंगे कि बहुत लंबे समय से अवरुद्ध कर दिया गया है। हालांकि यहां एक बहुत ही उदाहरण हैं, यहां तक ​​कि बाहर निकलने के साथ पूर्ण कोड के साथ एक सहायक थ्रेड में और उस तरह की योजना मेरे पास स्थितियों के तहत काम नहीं करती है।

+0

क्या आपके पास कोई उदाहरण है? एक विदेशी कॉल पर अवरुद्ध होने के अलावा, आप किस मामले के बारे में सोच रहे हैं? –

+0

मैं शायद एक छोटा सा उदाहरण बना सकता हूं लेकिन नेटवर्क-बाइटस्ट्रिंग (0.1.3) और विंडोज 7/विस्टा/2003/2008/2008r2 के तहत आरईवी का उपयोग करते समय आरईवी कुछ नेटवर्क स्थिति होने तक अवरुद्ध हो जाएगा। मैं सिर्फ उस कनेक्शन को स्क्रैप करना चाहता हूं और पूरे एप्लिकेशन से बाहर निकलने के बिना फिर से शुरू करना चाहता हूं (यानी टाइमआउट)। – Jonke

+0

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

उत्तर

3

ऊपर मेरी टिप्पणी पर विस्तार करने के लिए, आप विदेशी कॉल अवरुद्ध करने में बाधा नहीं डाल सकते हैं। हालांकि, आप nonblocking IO का उपयोग कर सकते हैं। नेटवर्क पैकेज के मामले में, इसका मतलब तारों के लिए recvLen है, और recvFrom बाइटस्टर्स के लिए है। मुझे लगता है कि आप हमेशा थ्रेडेड रनटाइम को भी निर्दिष्ट कर रहे हैं?

+0

यह इस बिंदु पर अभी तक एक उत्तर की सबसे नज़दीकी चीज है, हालांकि मैं इसे अपनी विशेष समस्या में उपयोग नहीं कर सकता। हालांकि मैं सॉकेट को एक एमवीआर में डाल सकता हूं और मुझे अपने पर्यवेक्षक थ्रेड में सॉकेट को बंद करने के लिए प्रभाव पड़ सकता है, अगर मैं करीबी सॉकेट से पहले हत्यारे कॉल को डालता हूं। – Jonke

2

Posix में वातावरण आप के साथ पूरी प्रक्रिया को समाप्त कर सकते हैं:

-- | @'exitImmediately' [email protected] calls @[email protected] to terminate the process 
-- with the indicated exit @[email protected] 
-- The operation never returns. 
exitImmediately :: ExitCode -> IO() 

the unix package से। Win32 package के तहत एक समान गैर-पॉज़िक्स सुविधा हो सकती है।

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

1

आप अपने ऐप में किसी भी थ्रेड से ExitProcess() API को कॉल कर सकते हैं और पूरी प्रक्रिया, धागे और सभी को समाप्त कर दिया जाएगा। कुछ डीएलएल डिटेच के साथ कुछ गठजोड़ हैं जो किसी समस्या का कारण बन सकते हैं और प्रक्रिया को तब तक समाप्त नहीं किया जा सकता जब तक कि इसके लिए सभी हैंडल जारी नहीं किए जाते हैं, लेकिन ExitProcess() हमेशा मेरे लिए अंतिम उपाय के रूप में ठीक काम करता है।

ExitProcess() परवाह नहीं है कि आपके धागे किस स्थिति में हैं। I/O पर अवरुद्ध किया जा सकता है या बाहर निकलने वाले धागे की तुलना में एक अलग प्रोसेसर पर चल रहा है - इससे कोई फर्क नहीं पड़ता, ओएस उन्हें रोक देगा सब।

Rgds, मार्टिन

3

एक दूसरी बात यह ध्यान रखें कि GHC कार्यक्रमों को समाप्त ही मुख्य थ्रेड समाप्त हो जाता है है। बाल धागे की लचीला महत्वहीन है। यदि आप अपने ऐप को डिज़ाइन करते हैं जैसे कि आप हमेशा मुख्य थ्रेड को सिग्नल कर सकते हैं कि यह समाप्त होने का समय है, इससे कोई फर्क नहीं पड़ता कि किसी भी बच्चे के धागे कितने अवरुद्ध हैं।

+0

इस प्रकार मैंने वर्तमान में इस मुद्दे को हल किया है, लेकिन मैं वास्तव में थ्रेड को त्यागना चाहता हूं और थ्रेड में मौजूद आईओ को पुनरारंभ करना चाहता हूं। – Jonke