Maison >développement back-end >Golang >Quand devez-vous utiliser un mutex sur un canal dans Go ?
Quand devez-vous utiliser un mutex sur un canal ?
Dans Go, les primitives de synchronisation telles que les mutex et les canaux jouent un rôle crucial dans la gestion des accès à des ressources partagées. Bien que les deux puissent être utilisés pour protéger les sections critiques du code, il existe des scénarios spécifiques dans lesquels chacun est plus approprié.
Choisir un mutex
Les mutex sont idéaux lorsque vous avez besoin de :
Exemple : Compteur simple
Considérons un simple compteur incrémenté dans des goroutines distinctes. Un mutex protège efficacement le compteur des accès simultanés, garantissant des mises à jour précises.
const iterations = 10000 var count int var m sync.Mutex func increment() { m.Lock() count++ m.Unlock() } func main() { for i := 0; i < iterations; i++ { go increment() } time.Sleep(1 * time.Second) fmt.Println(count) // Prints the final counter value }
Choisir une chaîne
Les chaînes, en revanche, excellent dans :
Exemple : jeu de ping-pong
Le jeu de ping-pong classique montre comment les chaînes peuvent transmettre un message entre goroutines , représentant l'état de la balle.
import "fmt" var ball = make(chan string) func ping() { for { m := <-ball fmt.Println(m) ball <- "pong" } } func pong() { for { m := <-ball fmt.Println(m) ball <- "ping" } } func main() { go ping() go pong() ball <- "ping" time.Sleep(1 * time.Second) // Allow goroutines to run for a while }
Exemple : Cache simple
Les canaux peuvent servir de mécanisme de cache simple, contrôlant l'accès à un magasin de données partagé et garantissant que les données cohérence.
import "sync" type Cache struct { m sync.Mutex items map[string]string } func (c *Cache) Get(key string) string { c.m.Lock() defer c.m.Unlock() return c.items[key] } func (c *Cache) Set(key, value string) { c.m.Lock() defer c.m.Unlock() c.items[key] = value } func main() { cache := Cache{items: make(map[string]string)} cache.Set("foo", "bar") fmt.Println(cache.Get("foo")) // Prints "bar" }
Conclusion
Le choix de la bonne primitive de synchronisation pour votre cas d'utilisation spécifique est essentiel pour maintenir l'intégrité et les performances des données dans les programmes Go simultanés. Tenez compte des exigences spécifiques et des compromis lorsque vous optez pour un mutex ou un canal.
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!