2010-10-17 8 views
9

Kanäle kombinieren die Kommunikation - den Austausch eines Wertes - mit der Synchronisation - damit zwei Berechnungen (Goroutinen) in einem bekannten Zustand sind.Wie können wir Kanäle in Go anstelle von Mutex verwenden?

Wie ist es möglich, die Kanäle in Google Go zu verwenden, um die Funktionalität von Mutex durchzuführen?

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

Diese Frage verfehlt Art den Punkt. Du solltest dich fragen "Warum brauche ich einen Mutex und wie kann ich stattdessen Kanäle verwenden?" –

Antwort

17

Ein Beispiel einen Kanal als Mutex verwenden:

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

Danke für die Antwort MizardX. – Kevin

+0

Tolle Lösung !! – HaltingState

+2

Während Kanäle eine gute Lösung für geschützte Daten bieten, ist es im Fall eines Schreibers und vieler Leser eine weniger effiziente Lösung. –

4

Wenn Sie einen Kanal haben c, die Sie mit 1 Punkt in initialisieren, dann können Sie „check out“, um die „Mutex“ durch den Wert aus dem Kanal zu entfernen (<-c). Sie können es "freigeben", indem Sie den Wert zurück (c <- 1) hinzufügen.

Da der extract-from-channel-Operator a) atomar ist und b) blockiert, bis etwas zu extrahieren ist, funktioniert es als Mutex, denn wenn ein Thread der Ausführung bereits ausgecheckt hat, ist nichts drin Der Kanal wird also blockiert, bis der Thread, der ihn ausgecheckt hat, einen Wert an den Kanal zurückgibt, der von einem anderen Thread extrahiert werden soll.

+0

Danke Bernstein. Können wir das oben gezeigte Beispiel mit Kanälen anstelle von Mutex implementieren? – Kevin