2010-12-01 14 views
6

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

शुद्ध रूप से गणना धागे शायद अलग-अलग संभाले जाएंगे, है ना?

क्या यह कुशल और सुरक्षित है? क्या ऐसा करने के लिए इससे अच्छा तरीका है?

धन्यवाद!

उत्तर

1

विंडोज़ में, मैं एक फ़ंक्शन को कॉल करने के लिए QueueUserAPC का उपयोग करता हूं जो अपवाद फेंकता है, जिससे धागे साफ से बाहर निकलते हैं।

मैं यहाँ इस जवाब में विवरण के बारे में अधिक लिखा है:

How do I guarantee fast shutdown of my win32 app?

संक्षेप में, यहाँ क्या होता है:

कहो धागा एक धागा बी (और फिर सी, डी समाप्त करना चाहता है, ...)

  • थ्रेड एक QueueUserAPC() कॉल, बी और एक समारोह का पता जिस वर्ग के एक अपवाद फेंक होगा सूत्र में बाँधना संभाल गुजर मेरे ThreadExit।
  • थ्रेड बी सामान्य रूप से तब तक चलता है जब तक कि यह कुछ ऐसा नहीं कहता है जो सतर्क प्रतीक्षा के लिए जांच करता है। शायद WaitForSingleObjectEx, शायद SleepEx, या कुछ और।
  • इस बिंदु पर, धागा, एपीसी समारोह पहले पारित कर दिया चलाता है के कारण अपवाद थ्रेड बी
  • सभी ढेर-आवंटित वस्तुओं स्वचालित रूप से सही ढंग से विलुप्त हो के रूप में अपवाद धागा बी 'खोलना' अपनी ढेर बनाता है में फेंक दिया जाना चाहिए।
  • थ्रेड बी का बाहरीतम थ्रेड फ़ंक्शन अपवाद को पकड़ लेगा।
  • थ्रेड बी अब बाहर निकलता है, संभवतः थ्रेड ए को संकेत देता है कि यह हो गया है।
+0

स्मार्ट लगता है, लेकिन जब भी मैं इसे पढ़ता हूं, तो मैं बस "यह बहुत ही आसान है" महसूस नहीं कर सकता ... – Necrolis

+0

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

+0

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

4

मैं क्या करना है, यह जानने के लिए बुलियन (या अन्य) स्थिति चर की जांच करने वाले धागे का प्रशंसक नहीं हूं, क्योंकि यह अपमानजनक है। नए निर्देश हैं या नहीं, यह देखने के लिए धागे को लगातार चरम जांचना होगा। यह सीपीयू जलता है।

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

+0

(मैं समानांतर नया हूँ सिद्धांत) मेरा आवेदन विशेष रूप से विंडोज है - कैसे धागे एक घटना पर इंतजार करते हैं? कोई संसाधन जो आप मुझे इंगित कर सकते हैं? – oneminute

+0

Windows में, आप() CreateEvent द्वारा बनाई गई एक घटना के लिए इंतजार करना कार्यों के WaitForSingleObject() परिवार का प्रयोग करेंगे। लिंक: http://msdn.microsoft.com/en-us/library/ms682396(VS.85).aspx –

+0

मैं एक छोटे से उलझन में हूँ .. इसलिए प्रत्येक सूत्र में मैं WaitForSingleObject की वापसी की जाँच (exitHandle, 0) यह देखने के लिए कि बाहर निकलने की घटना का संकेत है या नहीं? – oneminute

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