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?

Patricia Arquette
Patricia ArquetteOriginal
2024-12-25 05:03:21924Durchsuche

How Can I Safely Read Values from Multiple Goroutines in Go?

Werte aus verschiedenen Threads in Go sicher lesen

In Go ist der gleichzeitige Zugriff auf Werte aus mehreren Goroutinen ohne ordnungsgemäße Synchronisierung gefährlich. Um die Datenintegrität sicherzustellen, ist es wichtig, Synchronisierungsmechanismen einzusetzen.

Synchronisierung mit Mutexes und Lese-/Schreibsperren

In dem gegebenen Szenario, in dem der Hauptthread sammeln muss Werte von Arbeitsthreads alle 10 Sekunden, Kanäle reichen nicht aus. Stattdessen kann ein Lese-/Schreib-Mutex verwendet werden.

Die Worker erhalten eine Schreibsperre, wenn sie ihre Werte aktualisieren, während der Hauptthread eine Lesesperre erhält, wenn er Werte abruft. Dies verhindert Race Conditions und garantiert Datenkonsistenz.

Beispielimplementierung mit Mutex

Der folgende Code veranschaulicht eine einfache Implementierung mithilfe eines Mutex:

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) setIter(n int) {
    w.iterMu.Lock()
    w.iter = n
    w.iterMu.Unlock()
}

Alternative: Verwendung von Atomzählern

Alternativ können die Das sync/atomic-Paket bietet threadsichere atomare Zähler, die direkte Lese- und Schreibvorgänge ohne den Overhead von Mutexes ermöglichen.

type Worker struct {
    iter int64
}

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

func (w *Worker) setIter(n int64) {
    atomic.StoreInt64(&w.iter, n)
}

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