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
Linda HamiltonOriginal
2024-12-21 15:47:14784Durchsuche

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

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!

Stellungnahme:
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