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

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

Linda Hamilton
Libérer: 2024-12-21 15:47:14
original
702 Les gens l'ont consulté

How to Safely Read Values from Multiple Goroutines in Go?

Lecture des valeurs de plusieurs threads en toute sécurité

Dans les scénarios où plusieurs threads fonctionnent simultanément dans Go, il est crucial de garantir un accès sécurisé aux données. Cet article explore un scénario dans lequel un thread principal nécessite la collecte de données à partir des threads de travail sans compromettre la sécurité des threads.

Scénario

Le thread principal crée plusieurs threads de travail, chacun s'exécutant dans sa propre goroutine et incrémentant un nombre d'itérations à intervalles réguliers. Toutes les 10 secondes, le thread principal vise à collecter le nombre d'itérations des travailleurs et à afficher des statistiques consolidées.

Question

Étant donné que le thread principal ne lit que pendant que les threads individuels écrivent, est-il sûr d'accéder directement aux valeurs ? Comment cela peut-il être implémenté efficacement ?

Réponse

La lecture directe des valeurs de différents threads sans synchronisation est intrinsèquement dangereuse dans Go, car elle peut présenter un comportement indéfini. Pour garantir l'intégrité des données, une certaine forme de synchronisation est nécessaire.

Considérations de mise en œuvre

La solution suggérée utilise un sync.RWMutex pour protéger les données partagées. Lorsque les travailleurs écrivent sur le nombre d'itérations, ils acquièrent un verrou en écriture, et lorsque le thread principal lit, il acquiert un verrou en lecture.

Exemple de code utilisant sync.RWMutex

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) incIter() {
    w.iterMu.Lock()
    w.iter++
    w.iterMu.Unlock()
}
Copier après la connexion

Alternativement, le package sync/atomic peut être utilisé pour gérer les modifications de données thread-safe, comme démontré dans ce qui suit code :

Exemple de code utilisant sync/atomic

type Worker struct {
    iter int64
}

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

func (w *Worker) incIter() {
    atomic.AddInt64(&w.iter, 1)
}
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