2008-12-06 16 views
30

मेरे पास डेटा है जो किसी निश्चित पृष्ठभूमि थ्रेड पर निष्पादित करने की आवश्यकता है। मेरे पास अन्य सभी धागे से कोड आ रहा है जिसे इसमें कॉल करने की आवश्यकता है। तुल्यकालन इस सूत्रण आवश्यकतासर्वश्रेष्ठ थ्रेडिंग कतार उदाहरण/सर्वोत्तम अभ्यास

उत्तर

8

आप कर सकते थे या तो:

  • लागू एक producer/consumer model (जो थ्रेड-सुरक्षित उपयोग नहीं generic queue)
  • या अपनी पृष्ठभूमि में उपयोग थ्रेड एक synchronized queue है, जो एक संग्रह के माध्यम से गणना कर रहा है की प्रक्रिया पर टिप्पणी नहीं करता है।
+0

कोड नमूना: // MSDN। microsoft.com/en-us/library/yy12yx1f।एएसपीएक्स) की अनुशंसा नहीं की जाती है क्योंकि इसकी संभावित दौड़ स्थिति होती है जिसके परिणामस्वरूप खोए गए सिग्नल होते हैं। इसका इस्तेमाल न करें! –

5

यह ThreadPools पर एक दिलचस्प लेख है समर्थन करने के लिए करता है किसी को भी एक अच्छा ट्यूटोरियल या एक कतार होने पर सबसे अच्छा अभ्यास है:

http://www.codeproject.com/KB/threads/smartthreadpool.aspx

सरल उपयोग के मामलों के लिए आप नेट की अपनी थ्रेडपूल क्लास का भी उपयोग कर सकता है।

1

इस समस्या के मेरे पसंदीदा समाधानों में से एक producer/consumer पैटर्न के समान है।

मैं एक मास्टर थ्रेड (काफी मेरा प्रोग्राम Main()) बनाता है जिसमें अवरुद्ध कतार वस्तु होती है।

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

आप कॉन्फ़िगरेशन चर के अनुसार इच्छित कर्मचारियों की संख्या को गतिशील रूप से प्रबंधित कर सकते हैं या इसे ठीक कर सकते हैं - क्योंकि वे सभी कतार से चीजों को पॉप अप कर रहे हैं, श्रमिकों की संख्या में कोई जटिलता नहीं है।

मेरे मामले में, मेरे पास एक सेवा है जो विभिन्न प्रकार के tasks को संसाधित करती है। मेरे पास TaskQueueTask जैसी सामान्य जेनेरिक को संभालने के लिए टाइप की गई कतार है। फिर मैं उस सबस्क्रास को Execute() विधि को ओवरराइड करता हूं।


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

+0

यहाँ एक अवरुद्ध कतार है: http://www.eggheadcafe.com/articles/20060414.asp [पहली कड़ी] (http में –

31

जोसेफ अल्बाहारी द्वारा Threading in C# देखें, मल्टीथ्रेडिंग के बारे में बहुत पूर्ण संदर्भ। विशेष रूप से, वह producer/consumer queues को शामिल करता है।

+1

अल्बाहारी के लिए आपका थ्रेडिंग लिंक एक बहुत ही महान संसाधन है। – CaptainBli

0

आप इस समाधान का प्रयास कर सकते हैं। यह आपको उत्पादक-उपभोक्ता पैटर्न को कार्यान्वित करने का तरीका दिखाता है। इसके बारे में कुछ स्पष्टीकरण भी है कि इसके साथ क्या किया जा सकता है। उत्पादकों और उपभोक्ताओं की संख्या के विभिन्न संयोजनों की तरह।

http://devpinoy.org/blogs/jakelite/archive/2009/01/12/threading-patterns-the-producer-consumer-pattern.aspx

http://devpinoy.org/blogs/jakelite/archive/2009/02/03/threading-patterns-producer-consumer-pattern-examples.aspx

+0

दोनों लिंक अब अमान्य हैं। – Lichader

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