2010-10-17 6 views
9

Les canaux combinent la communication - l'échange d'une valeur - avec la synchronisation - garantissant que deux calculs (goroutines) sont dans un état connu.Comment pouvons-nous utiliser des canaux dans Go à la place de mutex?

Comment est-il possible d'utiliser les canaux de Google Go pour exécuter les fonctionnalités de mutex?

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

Cette question passe à côté du genre point. Vous devriez vous demander "pourquoi je veux un mutex, et comment puis-je utiliser des canaux à la place?" –

Répondre

17

Un exemple d'utilisation d'un canal comme 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

Merci pour la réponse MizardX. – Kevin

+0

Une solution géniale !! – HaltingState

+2

Tandis que les canaux fournissent une bonne solution aux données protégées, c'est une solution moins efficace dans le cas d'un auteur et de nombreux lecteurs. –

4

Si vous avez un canal c que vous initialisez avec 1 pièce, alors vous pouvez « vérifier » la « mutex » en supprimant la valeur du canal (<-c). Vous pouvez le "libérer" en ajoutant la valeur en retour (c <- 1). Puisque l'opérateur a) est atomique, et b) bloque jusqu'à ce qu'il y ait quelque chose à extraire, il fonctionne comme un mutex, puisque si un thread d'exécution a déjà été extrait, il n'y aura rien le canal, et donc il va bloquer jusqu'à ce que le thread qui l'a fait sortir renvoie une valeur au canal pour un autre thread à extraire.

+0

Merci Ambre. Pouvons-nous avoir l'exemple montré ci-dessus mis en œuvre en utilisant des canaux au lieu de mutex? – Kevin

Questions connexes