Mutex vs Channel : quand utiliser chacun dans Go
Quand il s'agit de concurrence dans Go, la sélection de la bonne primitive de synchronisation est cruciale. Traditionnellement, les mutex ont été utilisés pour protéger les ressources partagées entre plusieurs goroutines. Cependant, les canaux sont apparus comme une alternative, offrant des solutions élégantes et efficaces à de nombreux problèmes de synchronisation.
Quand utiliser un mutex
Les mutex sont idéaux lorsque :
Exemple :
Considérons un simple compteur :
type Counter struct { mu sync.Mutex value int } func (c *Counter) Inc() { c.mu.Lock() c.value++ c.mu.Unlock() }
Le sync.Mutex garantit qu'un seul goroutine peut incrémenter la valeur à la fois, empêchant ainsi les données courses.
Quand utiliser une chaîne
Les chaînes sont utiles lorsque :
Exemple :
Considérons une partie de ping-pong :
package main import ( "fmt" ) func main() { ball := make(chan string) go player("ping", ball) go player("pong", ball) ball <- "ping" <-ball } func player(name string, ball chan string) { for { msg := <-ball fmt.Println(name, msg) if msg == "pong" { return } ball <- "pong" } }
La boule de canal coordonne le jeu de ping-pong, garantissant que les messages sont transmis entre les goroutines de manière synchronisée.
En conclusion, les deux Les mutex et les canaux offrent des moyens de synchronisation efficaces dans Go, mais le choix de celui à utiliser dépend des exigences spécifiques du problème à résoudre. Les mutex offrent un contrôle précis sur l'accès aux ressources, tandis que les canaux offrent des mécanismes efficaces de communication et de gestion des événements.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!