Compteur global dans un système hautement concurrent
Question :Comment puis-je créer un compteur global partagé qui peut être accessible par plusieurs goroutines sans duplication dans un système hautement concurrent ?
Vous avez mentionné faire référence à une question précédente et essayer d'utiliser un compteur de canal, ce qui n'est généralement pas recommandé pour un compteur partagé. Bien que cela puisse fonctionner dans certains scénarios, cela devient problématique dans les situations à forte concurrence.
Réponse :
1. Package atomique :
L'approche la plus efficace pour mettre en œuvre un compteur partagé consiste à utiliser le package atomique fourni par Go. Les opérations atomiques garantissent que les modifications apportées aux données partagées sont exécutées comme une seule action indivisible, empêchant ainsi les conditions de concurrence critique.
Exemple :
<code class="go">import "sync/atomic" var globalCounter int32 = 0 // Atomically updated counter func IncrementCounter() { atomic.AddInt32(&globalCounter, 1) // Atomically increments the counter } func ReadCounter() int32 { return atomic.LoadInt32(&globalCounter) // Atomically reads the counter's value }</code>
2. Canal synchronisé :
Une autre option consiste à utiliser un canal synchronisé pour partager la valeur du compteur. Cependant, cette approche est moins efficace et introduit une complexité supplémentaire.
Exemple :
<code class="go">var counter chan int = make(chan int, 1) func IncrementCounter() { counter <- 1 } func ReadCounter() int { return <-counter }</code>
Dans l'extrait de code fourni, vous avez implémenté un compteur thread-safe en utilisant un canal pour l'échange de valeurs. . Cependant, vous devez également envisager des opérations thread-safe pour réinitialiser la valeur. Une mise en œuvre appropriée ressemblerait à :
<code class="go">var addCounterChan chan int = make(chan int, 100) var readCounterChan chan int = make(chan int, 100) func AddCounter() { addCounterChan <- 1 } func GetCount() int { return <-readCounterChan }</code>
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!