2010-10-17 9 views
9

चैनल संचार को जोड़ते हैं-एक मूल्य का आदान-प्रदान - सिंक्रनाइज़ेशन के साथ-यह गारंटी देता है कि दो गणना (goroutines) एक ज्ञात स्थिति में हैं।हम म्यूटेक्स के स्थान पर गो में चैनल का उपयोग कैसे कर सकते हैं?

म्यूटेक्स की कार्यक्षमता करने के लिए Google Go में चैनलों का उपयोग करना कैसे संभव है?

package main 

import "sync" 

var global int = 0 
var m sync.Mutex 

func thread1(){ 
    m.Lock() 
    global = 1 
    m.Unlock() 
} 

func thread2(){ 
    m.Lock() 
    global = 2 
    m.Unlock() 
} 

func main(){ 
    go thread1() 
    go thread2() 
} 
+3

यह सवाल तरह की बात याद करते हैं। आपको खुद से पूछना चाहिए "मैं एक म्यूटेक्स क्यों चाहता हूं, और मैं इसके बजाय चैनल का उपयोग कैसे कर सकता हूं?" –

उत्तर

17

एक चैनल एक Mutex के रूप में प्रयोग का एक उदाहरण:

package main 

var global int = 0 
var c = make(chan int, 1) 

func thread1(){ 
    <-c // Grab the ticket 
    global = 1 
    c <- 1 // Give it back 
} 

func thread2(){ 
    <-c 
    global = 2 
    c <- 1 
} 

func main() { 
    c <- 1 // Put the initial value into the channel 
    go thread1() 
    go thread2() 
} 
+0

उत्तर MizardX के लिए धन्यवाद। – Kevin

+0

बहुत बढ़िया समाधान !! – HaltingState

+2

जबकि चैनल सुरक्षित डेटा के लिए एक अच्छा समाधान प्रदान करते हैं, यह एक लेखक और कई पाठकों के मामले में एक कम कुशल समाधान है। –

4

आप किसी चैनल c है कि आप इसे में 1 आइटम के साथ प्रारंभ है, तो आप "म्युटेक्स" चैनल (<-c) से मूल्य को हटाने के द्वारा "की जाँच" कर सकते हैं। आप मूल्य वापस जोड़कर इसे "रिलीज़" कर सकते हैं (c <- 1)।

निकालने-से-चैनल ऑपरेटर ए) परमाणु है, और बी) निकालने के लिए कुछ होने तक ब्लॉक करता है, यह एक म्यूटेक्स के रूप में काम करता है, क्योंकि अगर निष्पादन का एक धागा पहले से ही चेक आउट हो गया है, तो इसमें कुछ भी नहीं होगा चैनल, और इस प्रकार यह तब तक अवरुद्ध हो जाएगा जब तक यह चेक आउट नहीं किया गया था, दूसरे चैनल के लिए निकालने के लिए चैनल को एक मान देता है।

+0

धन्यवाद एम्बर। क्या हमारे पास mutex के बजाय चैनलों का उपयोग करके लागू किए गए उदाहरण को दिखाया जा सकता है? – Kevin

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

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