2013-06-01 5 views
33

मुझे एक प्रोग्राम मिला है जो कई धागे का उपयोग करता है। जैसा कि मैं इसे समझता हूं, जब थ्रेड 0 निकलता है, तो पूरा प्रोग्राम बाहर निकलता है, भले ही किसी भी अन्य धागे जो अभी भी चल रहे हों।हास्केल प्रोग्राम से बाहर निकलने का सबसे अच्छा तरीका क्या है?

बात यह है कि, इन अन्य धागे में फाइलें खुली हो सकती हैं। स्वाभाविक रूप से, यह अपवाद-हैंडलिंग कोड में लपेटा गया है जो किसी समस्या के मामले में फ़ाइलों को साफ़ रूप से बंद कर देता है। इसका अर्थ यह भी है कि यदि मैं killThread (जिसे throwTo के माध्यम से कार्यान्वित किया गया है) का उपयोग करते हैं, तो फ़ाइल थ्रेड से बाहर होने से पहले बंद होनी चाहिए।

मेरा सवाल है, अगर मैं अन्य थ्रेड को रोकने के प्रयास के बिना थ्रेड 0 बाहर निकलने देता हूं, तो क्या सभी विभिन्न फाइल हैंडल अच्छी तरह से बंद हो जाएंगे? क्या कोई buffered आउटपुट flushed हो जाता है?

संक्षेप में, क्या मैं बस बाहर निकल सकता हूं, या क्या मुझे पहले धागे को मैन्युअल रूप से मारने की आवश्यकता है?

+2

मैं अच्छी प्रोग्रामिंग स्वच्छता के मामले के रूप में अन्य धागे को साफ करने के लिए 'killThread' या' exit 'पर भरोसा नहीं करना पसंद करता हूं। मैं मुख्य धागे से साफ-सफाई संकेतों को सुनने के लिए अपने सभी धागे का वाद्य यंत्र करता हूं ताकि वे सभी को गहराई से बंद कर दिया जा सके। –

+0

क्यों कोशिश नहीं करते? आईएमई, अधिकांश ओएस फाइलों को बंद कर देगा, (यानी कोई संभाल, एफडी या अन्य रिसाव छोड़ें), लेकिन बकाया I/O फ़्लश नहीं किया जाएगा। –

+1

@ गैब्रियल गोंज़ालेज़ यदि आप इसे इस तरह से करते हैं, तो इसका मतलब है कि एक धागा केवल कुछ बिंदुओं पर समाप्त हो जाएगा।यदि आप नियमित रूप से पर्याप्त रूप से जांचना भूल जाते हैं, या कुछ अपेक्षा से अधिक समय लेता है, तो आप एक ऐसी स्थिति प्राप्त कर सकते हैं जहां आप धागे को मरने के संकेत देते हैं, और यह नहीं (या वास्तव में बहुत लंबा समय लगता है)। आपको अपवादों को किसी भी तरह से संभालने की ज़रूरत है, तो क्यों 'killThread' का उपयोग न करें? – MathematicalOrchid

उत्तर

3

मेरे परीक्षण से, मैं कुछ चीजें की खोज की है:

  1. exitFailure और दोस्तों के केवल धागा 0. में काम करते हैं (प्रलेखन वास्तव में ऐसा कहते हैं, अगर आप इसे पढ़ने के परेशान करने के लिए जाना इन कार्यों। एक अपवाद अपने धागा, या अपने पूरे कार्यक्रम को मारता है, तो बस अपवाद है, जो चुपचाप अन्य धागे में अनदेखी कर रहे हैं फेंक देते हैं।)

  2. , किसी भी खुले हैंडल नहीं प्लावित कर रहे हैं। यह बेहद परेशान है जब आप बेहद आकस्मिक रूप से यह पता लगाने की कोशिश कर रहे हैं कि आपका प्रोग्राम क्रैश हो गया है!

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

3

आप इसे प्राप्त करने के लिए Control.Concurrent.MVar का उपयोग कर सकते हैं। एक MVar अनिवार्य रूप से एक ध्वज है जो या तो 'खाली' या "पूर्ण" है। एक थ्रेड MVar पढ़ने की कोशिश कर सकता है और यदि यह खाली है तो यह थ्रेड को अवरुद्ध करता है। जहां भी आपके पास एक थ्रेड है जो फ़ाइल IO करता है, उसके लिए MVar बनाएं, और MVar को तर्क के रूप में पास करें। एक सूची में आपके द्वारा बनाए गए सभी MVar रों रखो:

main = do 
    let mvars = sequence (replicate num_of_child_threads newEmptyMVar) 
    returnVals <- sequence (zipWith (\m f -> f m) 
            mvars 
            (list_of_child_threads :: [MVar -> IO a])) 

एक बार एक बच्चे धागा, सभी फाइल संचालन है कि आप के बारे में चिंतित हैं समाप्त हो गया है MVar लिखें। इसके बजाय लेखन killThread की आप

mapM_ takeMVar mvars >> killThread 

कर सकते हैं और जहां-कभी अपने धागा बाहर निकलने अन्यथा, बस सभी MVar रों ले जाएगा।

अधिक जानकारी के लिए documentation on GHC concurrency देखें।

+3

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

+0

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

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