In Szenarien, in denen mehrere Threads gleichzeitig in Go arbeiten, ist die Gewährleistung eines sicheren Datenzugriffs von entscheidender Bedeutung. In diesem Artikel wird ein Szenario untersucht, in dem ein Hauptthread eine Datenerfassung von Arbeitsthreads erfordert, ohne die Thread-Sicherheit zu beeinträchtigen.
Szenario
Der Hauptthread erstellt mehrere Arbeitsthreads, die jeweils ausgeführt werden eine eigene Goroutine erstellen und die Anzahl der Iterationen in regelmäßigen Abständen erhöhen. Ziel des Hauptthreads ist es, alle 10 Sekunden Iterationszahlen von Workern zu sammeln und konsolidierte Statistiken anzuzeigen.
Frage
Angesichts der Tatsache, dass der Hauptthread nur liest, während einzelne Threads schreiben, Ist es sicher, direkt auf Werte zuzugreifen? Wie kann dies effektiv implementiert werden?
Antwort
Das direkte Lesen von Werten aus verschiedenen Threads ohne Synchronisierung ist in Go grundsätzlich unsicher, da es zu undefiniertem Verhalten führen kann. Um die Datenintegrität sicherzustellen, ist eine Form der Synchronisierung erforderlich.
Überlegungen zur Implementierung
Die vorgeschlagene Lösung verwendet einen sync.RWMutex, um die gemeinsam genutzten Daten zu schützen. Wenn Worker bis zur Iterationsanzahl schreiben, erhalten sie eine Schreibsperre, und wenn der Hauptthread liest, erhält er eine Lesesperre.
Beispielcode mit 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() }
Alternativ kann das sync/atomic-Paket zur Verwaltung threadsicherer Datenänderungen verwendet werden, wie im Folgenden gezeigt Code:
Beispielcode mit 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) }
Das obige ist der detaillierte Inhalt vonWie kann ich Werte aus mehreren Goroutinen in Go sicher lesen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!