Wie implementiert man einen Thread-sicheren globalen Zähler in einem hochgradig gleichzeitigen Go-System?

DDD
Freigeben: 2024-10-31 16:36:01
Original
343 Leute haben es durchsucht

How to Implement a Thread-Safe Global Counter in a Highly Concurrent Go System?

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

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

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

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!

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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!