2012-10-27 12 views
6

गो का बफर किया गया चैनल अनिवार्य रूप से एक थ्रेड-सुरक्षित फीफो कतार है। (Is it possible to use Go's buffered channel as a thread-safe queue? देखें)क्या गो बफर्ड चैनल लॉकलेस है?

मुझे आश्चर्य है कि यह कैसे कार्यान्वित किया गया है। क्या यह Is there such a thing as a lockless queue for multiple read or write threads? में वर्णित की तरह लॉक-फ्री है?

जाओ के src निर्देशिका (grep -r Lock .|grep chan) में greping निम्नलिखित देता है उत्पादन:

./pkg/runtime/chan.c: Lock; 
./pkg/runtime/chan_test.go: m.Lock() 
./pkg/runtime/chan_test.go: m.Lock() // wait 
./pkg/sync/cond.go: L Locker // held while observing or changing the condition 

हालांकि मेरे मशीन (MacOS, इंटेल x86_64) पर ताला लगा होने के लिए नहीं है। क्या यह सत्यापित करने के लिए कोई आधिकारिक संसाधन है?

उत्तर

6

आप chan.c में runtime·chansend समारोह पढ़ा, तो आप उस runtime·lock जांच से पहले कहा जाता है, तो चैनल if(c->dataqsiz > 0) बफ़र है देखने के लिए देखेंगे।

दूसरे शब्दों में, buffered चैनल (और सामान्य रूप से सभी चैनल) ताले का उपयोग करते हैं।

आपकी खोज को यह कारण नहीं मिला कि आप पूंजी एल के साथ "लॉक" ढूंढ रहे थे। चैनलों के लिए लॉक फ़ंक्शन रनटाइम में एक गैर-निर्यातित सी फ़ंक्शन है।

+0

धन्यवाद! इस बारे में कोई विचार है कि इसे लॉक-फ्री के रूप में क्यों लागू नहीं किया गया है? –

+0

"लॉकफ्री" बेहतर प्रदर्शन का संकेत नहीं देता है। ताले के बारे में तर्क करना भी आसान है। उच्च विवाद होने पर लॉक विधि शायद तेज़ है। –

+0

धन्यवाद, @ स्टीफन-वेनबर्ग। यह अब और अधिक समझ में आता है। –

3

आप अपनी पसंद की हर चीज़ के लिए लॉक-फ्री (और यहां तक ​​कि प्रतीक्षा-मुक्त!) कार्यान्वयन भी लिख सकते हैं। सीएमपीएक्सएचजी जैसे आधुनिक हार्डवेयर प्राइमेटिव सार्वभौमिक रूप से उपयोग करने योग्य हैं। लेकिन इस तरह के एल्गोरिदम लिखना और सत्यापित करना सबसे आसान कार्यों में से एक नहीं है। इसके अलावा, बहुत तेज़ एल्गोरिदम मौजूद हो सकते हैं: लॉक फ्री एल्गोरिदम सामान्य रूप से एल्गोरिदम का एक बहुत ही छोटा सबसेट है।

जहां तक ​​मुझे याद है, दिमित्री व्याकोव ने अतीत में जाने के लिए लॉक-मुक्त एमपीएमसी (मल्टी-निर्माता/बहु उपभोक्ता) चैनल कार्यान्वयन लिखा है, लेकिन गो के चयन विवरण के साथ कुछ समस्याओं के कारण पैच को त्याग दिया गया था । इस कथन का समर्थन कुशलतापूर्वक वास्तव में कठिन लगता है।

गो के चैनल प्रकार का मुख्य लक्ष्य हालांकि उच्च स्तर की समेकन प्राथमिकता प्रदान करने के लिए है जो समस्याओं की एक विस्तृत श्रृंखला के लिए आसानी से प्रयोग योग्य है। यहां तक ​​कि डेवलपर्स जो समवर्ती प्रोग्रामिंग में विशेषज्ञ नहीं हैं, वे सही प्रोग्राम लिखने में सक्षम होना चाहिए जिन्हें बड़ी सॉफ्टवेयर परियोजनाओं में आसानी से समीक्षा और रखरखाव किया जा सकता है। यदि आप प्रदर्शन के हर अंतिम बिट को निचोड़ने में रुचि रखते हैं, तो आपको अपनी आवश्यकताओं के अनुरूप एक विशेष कतार कार्यान्वयन लिखना होगा।