Maison > développement back-end > Golang > Comment puis-je lire en toute sécurité les valeurs de plusieurs Goroutines dans Go ?

Comment puis-je lire en toute sécurité les valeurs de plusieurs Goroutines dans Go ?

Patricia Arquette
Libérer: 2024-12-25 05:03:21
original
919 Les gens l'ont consulté

How Can I Safely Read Values from Multiple Goroutines in Go?

Lire les valeurs en toute sécurité à partir de différents threads dans Go

Dans Go, l'accès simultané aux valeurs de plusieurs goroutines sans synchronisation appropriée est dangereux. Pour garantir l'intégrité des données, il est crucial d'utiliser des mécanismes de synchronisation.

Synchronisation avec mutex et verrous en lecture/écriture

Dans le scénario donné, où le thread principal doit collecter valeurs des threads de travail toutes les 10 secondes, les canaux ne suffiront pas. Au lieu de cela, un mutex en lecture/écriture peut être utilisé.

Les travailleurs obtiendront un verrou en écriture lors de la mise à jour de leurs valeurs, tandis que le thread principal acquerra un verrou en lecture lors de la récupération des valeurs. Cela évite les conditions de concurrence critique et garantit la cohérence des données.

Exemple d'implémentation avec Mutex

Le code suivant illustre une implémentation simple utilisant un mutex :

type Worker struct {
    iterMu sync.RWMutex
    iter   int
}

func (w *Worker) Iter() int {
    w.iterMu.RLock()
    defer w.iterMu.RUnlock()
    return w.iter
}

func (w *Worker) setIter(n int) {
    w.iterMu.Lock()
    w.iter = n
    w.iterMu.Unlock()
}
Copier après la connexion

Alternative : utiliser des compteurs atomiques

Alternativement, le Le package sync/atomic fournit des compteurs atomiques thread-safe, permettant des opérations de lecture et d'écriture directes sans la surcharge des mutex.

type Worker struct {
    iter int64
}

func (w *Worker) Iter() int64 {
    return atomic.LoadInt64(&w.iter)
}

func (w *Worker) setIter(n int64) {
    atomic.StoreInt64(&w.iter, n)
}
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal