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

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

Barbara Streisand
Freigeben: 2024-12-25 09:53:35
Original
413 Leute haben es durchsucht

How to Safely Read Values from Different Goroutines in Go?

Ist das Lesen von Werten aus verschiedenen Threads sicher?

In Go erfordert ein sicherer gleichzeitiger Zugriff auf Werte eine Synchronisierung, wenn mehrere Goroutinen beteiligt sind, insbesondere wenn mindestens einer von ihnen führt Schreibvorgänge aus. Im gegebenen Szenario ist es notwendig, eine Synchronisierung zu implementieren, um sich vor undefiniertem Verhalten zu schützen.

Empfohlener Ansatz: Verwendung von Mutexes

Kanäle können zwar eine Option für die Nachrichtenübermittlung sein, aber möglicherweise eingeführt werden unnötige Komplexität aufgrund der erforderlichen Synchronisierung für den Nachrichtenabruf im Hauptthread. Stattdessen wird empfohlen, Lese-/Schreibmutexe (sync.RWMutex) zu verwenden. Diese Sperren schützen Daten, indem sie den Erwerb von Sperren für Änderungsvorgänge (Worker) und den schreibgeschützten Zugriff für Statusabfragen (Hauptthread) erzwingen.

Beispielimplementierung

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

Dieser Ansatz stellt sicher, dass Worker, die die Iterationsanzahl ändern, Schreibsperren erhalten, während der Hauptthread, der die Anzahl liest, Lesesperren erhält sperrt.

Alternative: Atomare Operationen

Das sync/atomic-Paket stellt atomare Operationen bereit, die eine synchronisationsfreie Änderung bestimmter Datentypen, wie z. B. Ganzzahlen, ermöglichen. Es stellt die Integrität sicher, indem es Lese- und Änderungsvorgänge auf seine atomaren Funktionen beschränkt.

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

func (w *Worker) incIter() {
    atomic.AddInt64(&w.iter, 1)
}
Nach dem Login kopieren

Dieser Ansatz bietet einen einfacheren Synchronisierungsmechanismus, beachten Sie jedoch, dass er nur für bestimmte Datentypen anwendbar ist.

Durch Übernahme Mit einer dieser Methoden können Sie Werte von Arbeitern in verschiedenen Threads sicher lesen, um die Datenintegrität zu gewährleisten und undefiniertes Verhalten zu vermeiden.

Das obige ist der detaillierte Inhalt vonWie kann ich Werte aus verschiedenen 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