2012-06-01 12 views
7

मुझे एक पुनरावर्ती समस्या है जहां उपभोक्ता पेड़ के प्रत्येक स्तर पर कुछ काम करते हैं, फिर पेड़ को फिर से भरने और अगले स्तर पर वही काम करने की आवश्यकता होती है।निर्माता/उपभोक्ता पैटर्न में ब्लॉकिंगकोलेक्शन का उपयोग कैसे करते हैं जब निर्माता उपभोक्ता भी होते हैं - मैं कैसे समाप्त करूं?

मैं समांतर में इसे चलाने के लिए ConcurrentBag/BlockingCollection आदि का उपयोग करना चाहता हूं। इस परिदृश्य में, कतार के उपभोक्ता भी कतार के निर्माता हैं!

मेरी समस्या यह है: ब्लॉकिंग कोलेक्शन का उपयोग करके, मैं वस्तुओं को हटाने के लिए बहुत सरल फोरैच तर्क लिख सकता हूं, और कतार नई है - जब कतार खाली होती है, तो अवरुद्ध संग्रह सही ढंग से अवरुद्ध हो जाएगा, और नए काम के लिए इंतजार करना होगा अन्य उपभोक्ताओं में से एक।

लेकिन मुझे कैसे पता चलेगा कि सभी उपभोक्ता अवरुद्ध हैं या नहीं ?!

मुझे CompleteAdding() के बारे में पता है, लेकिन यह प्रतीत नहीं होता है, क्योंकि एकमात्र समय वास्तव में आप पूरा कर रहे हैं जब सभी उत्पादक उत्पादन कर रहे हैं और कतार खाली है - और चूंकि वे सभी अवरुद्ध हो जाएंगे, CompleteAdding() सेट करने के लिए कोई भी "मुक्त" नहीं है। क्या इसका पता लगाने का कोई तरीका है? (शायद एक घटना जो अवरुद्ध होने पर आग लग सकती है, और अनब्लॉक होने पर फिर से आग लग सकती है?)

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

अंतर्ज्ञान मुझे बता रहा है कि ऐसा करने के लिए ब्लॉकिंग संग्रह का उपयोग करने का कोई तरीका है, लेकिन मैं वहां काफी नहीं पहुंच सकता।

वैसे भी, किसी को भी जब उपभोक्ताओं निर्माता हैं और जब सभी ब्लॉक भयानक

+1

अच्छा सवाल। बाहरी झंडे या घटनाओं के साथ कुछ भी दौड़ की स्थिति के लिए परिपक्व लगता है। –

+0

प्रोसेसर (संयुक्त उपभोक्ता/उत्पादक) के पास बहुत सारे राज्य हैं या बहुत सारे संसाधन की आवश्यकता है? क्या आप 'टास्क' बनाने के मामले में समस्या को फिर से डाला जा सकता है कि प्रत्येक केवल एक ही पुनरावृत्ति करता है? –

+0

@Damien_The_Unbeliever: हाँ, मैं एकल पुनरावृत्ति कर सकता हूं, और वास्तव में पहले से ही यह काम कर रहा है, लेकिन मैं निर्माता/उपभोक्ता पैटर्न का उपयोग करने की कोशिश कर रहा हूं क्योंकि यह कोड भविष्य में क्लाउड में माइग्रेट किया जा सकता है, जहां कार्यकर्ता भूमिकाएं होंगी उसी तरह Azure Queue संग्रहण का उपयोग करके, और मैं समग्र कार्यान्वयन को दो कार्यान्वयन के बीच जितना संभव हो सके रखना चाहता हूं। उस परिदृश्य में मुझे यह जांचने के लिए मजबूर किया जाएगा कि श्रमिक यह तय करने के लिए निष्क्रिय हैं कि कतार पूरी की जाएगी, लेकिन ऐसा लगता है कि मुझे स्थानीय रूप से संभव होने पर कुशल होना चाहिए - मैं भी इसे समझना चाहता हूं :) –

उत्तर

-3

मुझे लगता है कि MSDN से इस लिंक पर आपकी मदद कर सकते हो सकता है जारी करने के लिए पता लगाने के लिए सक्षम होने के लिए एक अच्छा पैटर्न है।

Reusable Parallel Data Structures and Algorithms

यह समवर्ती स्थितियों में कुछ डेटा संरचनाओं के साथ सौदा करने के लिए कैसे उजागर करता है।

+1

2007 से डेटा संरचना 4.0 समवर्ती पुस्तकालयों के बारे में मेरे प्रश्न को संबोधित नहीं करती है। –

+0

तो 4.0 का उपयोग करके स्वयं को लागू करें। यह सिर्फ एक गाइड है, न कि "उत्तर"। – oarrivi

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