Globaler Zähler in einem hochgradig gleichzeitigen System
Frage: Wie kann ich einen gemeinsamen globalen Zähler erstellen, der sein kann Zugriff durch mehrere Goroutinen ohne Duplizierung in einem hochgradig gleichzeitigen System?
Sie haben erwähnt, dass Sie sich auf eine frühere Frage bezogen und versucht haben, einen Kanalzähler zu verwenden, was für einen gemeinsam genutzten Zähler im Allgemeinen nicht empfohlen wird. Während es in einigen Szenarien funktionieren kann, wird es in Situationen mit hoher Parallelität problematisch.
Antwort:
1. Atompaket:
Der effektivste Ansatz zur Implementierung eines gemeinsamen Zählers ist das von Go bereitgestellte Atompaket. Atomare Operationen stellen sicher, dass Änderungen an gemeinsam genutzten Daten als eine einzige unteilbare Aktion ausgeführt werden, wodurch Race Conditions wirksam verhindert werden.
Beispiel:
<code class="go">import "sync/atomic" var globalCounter int32 = 0 // Atomically updated counter func IncrementCounter() { atomic.AddInt32(&globalCounter, 1) // Atomically increments the counter } func ReadCounter() int32 { return atomic.LoadInt32(&globalCounter) // Atomically reads the counter's value }</code>
2. Synchronisierter Kanal:
Eine andere Möglichkeit besteht darin, einen synchronisierten Kanal zu verwenden, um den Zählerwert zu teilen. Dieser Ansatz ist jedoch weniger effizient und führt zu zusätzlicher Komplexität.
Beispiel:
<code class="go">var counter chan int = make(chan int, 1) func IncrementCounter() { counter <- 1 } func ReadCounter() int { return <-counter }</code>
Im bereitgestellten Code-Snippet haben Sie einen Thread-sicheren Zähler implementiert, indem Sie einen Kanal für den Werteaustausch nutzen . Sie sollten jedoch auch threadsichere Vorgänge zum Zurücksetzen des Werts in Betracht ziehen. Eine ordnungsgemäße Implementierung würde wie folgt aussehen:
<code class="go">var addCounterChan chan int = make(chan int, 100) var readCounterChan chan int = make(chan int, 100) func AddCounter() { addCounterChan <- 1 } func GetCount() int { return <-readCounterChan }</code>
Das obige ist der detaillierte Inhalt vonWie implementiert man einen Thread-sicheren globalen Zähler in einem hochgradig gleichzeitigen Go-System?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!