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() }
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) }
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!