2013-08-28 14 views
12

मैं भाषा के लिए नया हूं इसलिए मेरे साथ भालू।क्या अस्थिर/गैर-अस्थिर चर का समर्थन करता है?

मैं उत्सुक कैसे GO डेटा धागे के लिए उपलब्ध संग्रहण, इस अर्थ में कि गैर स्थानीय चर भी उदाहरण के लिए, गैर अस्थिर हो सकते हैं जावा में की तरह में संभालती हूँ।

GO चैनल है, जो है, यह स्वभाव है द्वारा की अवधारणा है - अंतर धागा संचार, इसका मतलब यह प्रोसेसर कैश नजरअंदाज, और पढ़ता/सीधे ढेर करने के लिए लिखता है।

इसके अलावा, गो लैंग दस्तावेज़ में अस्थिरता का कोई संदर्भ नहीं मिला है।

+0

यहां एक धारणा है कि 'अस्थिर' में सी/सी ++ अर्थ के बजाय जावा/.NET अर्थ है। –

उत्तर

3

नहीं, जाओ अस्थिर या पंजीकरण कथन का समर्थन नहीं करता है।

अधिक जानकारी के लिए this post देखें। यह Go for C++ Programmers guide में भी नोट किया गया है।

3

Go Memory Model प्रलेखन बताता है कि क्यों 'अस्थिर' की अवधारणा जाओ में कोई आवेदन किया है।

शिथिल: अन्य बातों के अलावा, goroutines रजिस्टरों में कैश goroutine-स्थानीय परिवर्तन रखने के लिए नि: शुल्क तो उन परिवर्तनों को अन्य goroutines द्वारा नमूदार नहीं हैं। स्मृति में उन परिवर्तनों को "फ्लश" करने के लिए, एक सिंक्रनाइज़ेशन किया जाना चाहिए। या तो ताले या संचार करके (चैनल भेज या प्राप्त) का उपयोग करके।

+2

गो मेमोरी मॉडल का कहना है कि अस्थिरता का समर्थन क्यों नहीं किया जाता है, और न ही यह समझाता है कि गो में अस्थिरता का कोई आवेदन क्यों नहीं है। इसके बजाए, यह बताता है कि यह कैसे काम करता है। अस्थिरता का अस्तित्व चरों को टैग करने के लिए बिल्कुल सही है जो अन्यथा सी या सी ++ में विभिन्न नियमों का पालन करेंगे। –

+0

फ़ंक्शन के बाहर बैठे चर के बारे में क्या, क्या उन्हें फ़ंक्शन के भीतर से एक्सेस किया जा सकता है? यदि ऐसा है, तो यदि वह फ़ंक्शन एक अलग थ्रेड चलाया जाता है, तो क्या बाहरी चर ढेर से सिंक हो जाता है या नहीं, अद्यतन पर? – Raul

+1

@ गुस्तावो निमेयर: यदि आप उस दस्तावेज़ से प्राप्त नहीं कर सकते हैं तो इसका मतलब यह नहीं है कि यह वहां नहीं है। और मैंने वास्तव में "लापरवाही" अनुच्छेद में व्युत्पन्न के संकेत को शामिल किया है। अस्थिर _memory_ चर को मजबूर पहुंच से समन्वयित किया जा सकता है (यही सी है)। कुछ अन्य goroutine के रजिस्टर में मौजूद मूल्यों को उसी तरह से संभाला नहीं जा सकता है। और मेमोरी मॉडल इस तरह के कार्यान्वयन की अनुमति देता है, जबकि सी अपडेट किए जाने पर ही रजिस्टर में एक अस्थिर चर डाल देगा। – zzzz

5

सरल उत्तर यह है कि अस्थिर वर्तमान गो विनिर्देश, अवधि द्वारा समर्थित नहीं है।

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

ध्यान दें कि यदि आप जीसी कंपाइलर सूट द्वारा समझा सी या असेंबली का उपयोग करते हैं, तो आपको इसके लिए कार्गो की भी आवश्यकता नहीं है, क्योंकि [568] सी सी/एएसएम कंपाइलर इसे संभालने में भी सक्षम हैं।

आप गो के स्रोत कोड में इसके उदाहरण पा सकते हैं।

कई अन्य उदाहरण के लिए Grep: उदाहरण के लिए।

के लिए कैसे जाओ में स्मृति का उपयोग कर सकते काम करता है, The Go Memory Model की जाँच

10

टीएल; डीआर: गो में एकाधिक goroutines लिखने/पढ़ने के लिए एक चर को सुरक्षित बनाने के लिए कोई कीवर्ड नहीं है। इसके लिए sync/atomic पैकेज का उपयोग करें। या बेहतर अभी तक Do not communicate by sharing memory; instead, share memory by communicatingtwo meanings of volatile volatile Ven diagram

नेट/जावा संगामिति

Go Memory Model से कुछ अंश के लिए


दो जवाब।

एक goroutine के प्रभाव एक और goroutine द्वारा मनाया जाना चाहिए, तो इस तरह के एक ताला के रूप में एक तुल्यकालन तंत्र का उपयोग करें या संचार चैनल एक रिश्तेदार आदेश की स्थापना के लिए।

Incorrect Synchronization अनुभाग से उदाहरणों में से एक मूल्य पर व्यस्त प्रतीक्षा का एक उदाहरण है।

इससे भी बदतर, कोई गारंटी नहीं कि किया लिखने कभी जा मुख्य द्वारा मनाया जाएगा, के बाद से वहाँ दो धागे के बीच कोई तुल्यकालन घटनाओं रहे हैं। मुख्य में लूप खत्म करने की गारंटी नहीं है।

दरअसल, यह कोड (play.golang.org/p/K8ndH7DUzq) कभी बाहर नहीं निकलता है।

C/C++ अमानक स्मृति

जाओ की स्मृति मॉडल अमानक स्मृति को संबोधित करने के लिए एक रास्ता प्रदान नहीं करता है। यदि आपके पास किसी डिवाइस की I/O बस पर कच्ची पहुंच है तो आपको मेमोरी स्थानों पर मूल्यों को सुरक्षित रूप से लिखने के लिए असेंबली या सी का उपयोग करना होगा। मुझे केवल डिवाइस ड्राइवर में ऐसा करने की आवश्यकता है जो आमतौर पर गो के उपयोग को रोकता है।

+2

संदर्भित कोड बाहर नहीं निकल रहा है क्योंकि मुख्य पाश निष्पादन से चलने वाले दिनचर्या को अवरुद्ध कर रहा है। रनटाइम बढ़ाकर। कोड को 2 से 2 तक बढ़ा रहा है: https://play.golang.org/p/n-sC8jISyw – PSanetra

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