Heim > Backend-Entwicklung > Golang > Wie kann ich Werte aus mehreren Goroutinen in Go sicher lesen?

Wie kann ich Werte aus mehreren Goroutinen in Go sicher lesen?

Linda Hamilton
Freigeben: 2024-12-21 15:47:14
Original
783 Leute haben es durchsucht

How to Safely Read Values from Multiple Goroutines in Go?

Werte aus mehreren Threads sicher lesen

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()
}
Nach dem Login kopieren

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)
}
Nach dem Login kopieren

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!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage