2012-03-08 13 views
9

मुझे धागे के बीच एक साझा Control.Concurrent.Chan के साथ एक समवर्ती प्रणाली को एक साथ रखना होगा। केवल एक उपभोक्ता और कई उत्पादक होंगे। Chan documentation पर देखकर मुझे उपभोक्ताओं और उत्पादकों की संख्या के बारे में कोई चेतावनी नहीं मिली जो एक ही चैनल पर काम कर सकती हैं, और स्रोत कोड MVar एस के लिए डिफ़ॉल्ट "सुरक्षित" एक्सेसर्स का उपयोग कर रहा है, इसलिए मुझे लगता है कि यह होना चाहिए यह मानने के लिए सुरक्षित है कि सीमाएं नहीं होनी चाहिए लेकिन मुझे यकीन नहीं है। तो, मेरा सवाल है ... क्या आप जानते हैं कि कई पाठकों और उत्पादकों के लिए हैकेल चैनल सुरक्षित हैं (सामान्य रूप से)?कई पाठकों/उत्पादकों के लिए हैकेल चैनल `Control.Concurrent.Chan` सुरक्षित हैं?

उत्तर

11

वे किसी भी धागे के लिए सुरक्षित हैं। वे एक साधारण एमवीआर-आधारित लिंक्ड सूची हैं। डिज़ाइन ट्रेड-ऑफ डुप्शन की अनुमति देता है जो एकाधिक पाठकों को प्रसारित करने के विपरीत मामले में मदद करता है।

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

+0

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

+0

इस तरह की एक गिनती बाधा एक मात्रा सेमफोर की तरह दिखती है, तो आप प्रारंभिक मात्रा (1-एन) का उपयोग करके http://hackage.haskell.org/package/SafeSemaphore में एमएसएएम या एमएसएमएन के साथ चैन की लिंक्ड-लिस्ट लम्बाई को प्रतिस्थापित कर सकते हैं। –

+0

मुझे हैकेल मंच में सेमफोर के बारे में पता नहीं था, इसे इंगित करने के लिए आपको बहुत बहुत धन्यवाद। मैं निश्चित रूप से चैनलों को उनके साथ बदल दूंगा। –