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
Freigeben: 2024-12-25 05:03:21
Original
919 Leute haben es durchsucht

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

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

Quelle:php.cn
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