Maison > développement back-end > Golang > le corps du texte

Comment implémenter un compteur global Thread-Safe dans un système Go hautement simultané ?

DDD
Libérer: 2024-10-31 16:36:01
original
342 Les gens l'ont consulté

How to Implement a Thread-Safe Global Counter in a Highly Concurrent Go System?

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>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!