2015-12-02 6 views
6

यदि मैं चैनलों का सही तरीके से उपयोग कर रहा हूं, तो क्या मुझे समवर्ती पहुंच के खिलाफ सुरक्षा के लिए म्यूटेक्स का उपयोग करने की आवश्यकता है?यदि मैं चैनलों का सही उपयोग कर रहा हूं तो मुझे म्यूटेक्स का उपयोग करने की आवश्यकता है?

उत्तर

9

यदि आप चैनलों का सही ढंग से उपयोग करते हैं तो आपको म्यूटेक्स की आवश्यकता नहीं है। कुछ मामलों में म्यूटेक्स के साथ एक समाधान हालांकि सरल हो सकता है।

बस सुनिश्चित करें कि एकाधिक गुणों को चैनल चरों तक पहुंचने का प्रयास करने से पहले चैनल मानों को धारण करने वाले चर को ठीक से प्रारंभ किया गया है। एक बार ऐसा करने के बाद, चैनलों तक पहुंच (जैसे मूल्यों को मूल्य भेजना या प्राप्त करना) डिज़ाइन द्वारा सुरक्षित है। संदर्भ (emphases मेरे द्वारा जोड़ा) के साथ

सहायक दस्तावेज:

Spec: Channel types:

एक चैनल send statements में इस्तेमाल किया जा सकता receive operations, और बिल्ट-इन कार्य cap और len करने के लिए कॉल बिना किसी सिंक्रनाइज़ेशन के बिना goroutines की किसी भी संख्या से। चैनल पहले-इन-फर्स्ट-आउट कतार के रूप में कार्य करते हैं। उदाहरण के लिए, यदि एक गोरौटाइन चैनल पर मूल्य भेजता है और दूसरा गोरौटाइन उन्हें प्राप्त करता है, तो भेजे गए क्रम में मूल्य प्राप्त होते हैं।

Effective Go: Concurrency: Share by communicating

समवर्ती प्रोग्रामिंग कई वातावरण में साझा चर करने के लिए सही पहुँच को लागू करने के लिए आवश्यक बारीकियों से मुश्किल बना दिया है। जाओ एक अलग दृष्टिकोण को प्रोत्साहित करता है जिसमें चैनलों पर साझा मूल्यों को पारित किया जाता है और वास्तव में, निष्पादन के अलग-अलग धागे द्वारा सक्रिय रूप से साझा नहीं किया जाता है। किसी भी समय किसी एक goroutine के मूल्य तक पहुंच है। डिज़ाइन द्वारा डेटा दौड़ नहीं हो सकती है। सोचने के इस तरीके को प्रोत्साहित करने के लिए हमने इसे एक नारे में घटा दिया है:

स्मृति साझा करके संवाद न करें; इसके बजाय, संचार करके स्मृति साझा करें।

इस दृष्टिकोण को बहुत दूर ले जाया जा सकता है। उदाहरण के लिए, एक पूर्णांक चर के चारों ओर एक mutex डालकर संदर्भ गणना सबसे अच्छी हो सकती है। लेकिन एक उच्च स्तरीय दृष्टिकोण के रूप में, उपयोग को नियंत्रित करने के लिए चैनलों का उपयोग करना स्पष्ट, सही प्रोग्राम लिखना आसान बनाता है।

यह लेख भी बहुत उपयोगी है: The Go Memory Model

इसके अलावा sync के पैकेज दस्तावेज़ से उद्धृत:

पैकेज सिंक इस तरह के पारस्परिक अपवर्जन ताले के रूप में बुनियादी तुल्यकालन पुरातन प्रदान करता है। एक बार और प्रतीक्षा समूह प्रकार के अलावा, अधिकतर निम्न-स्तरीय लाइब्रेरी दिनचर्या के उपयोग के लिए लक्षित हैं। चैनल और संचार के माध्यम से उच्च स्तरीय सिंक्रनाइज़ेशन बेहतर किया जाता है।

+1

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

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

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