Heim > Backend-Entwicklung > Golang > Wie vermeide ich Race Conditions, wenn ich sync.Cond für bedingtes Warten verwende?

Wie vermeide ich Race Conditions, wenn ich sync.Cond für bedingtes Warten verwende?

Susan Sarandon
Freigeben: 2024-11-10 14:21:02
Original
927 Leute haben es durchsucht

How to Avoid Race Conditions When Using sync.Cond for Conditional Waiting?

Korrekte Verwendung von sync.Cond für bedingtes Warten

Bei der Untersuchung der Funktionalität von sync.Cond wurde deutlich, dass eine Race Condition auftreten könnte zwischen dem Sperren des sync.Mutex und dem Aufrufen von cond.Wait. Um dies zu demonstrieren, wurde eine künstliche Verzögerung in die Haupt-Goroutine eingeführt, die die Race-Bedingung simuliert:

package main

import (
    "sync"
    "time"
)

func main() {
    var m sync.Mutex
    var c = sync.NewCond(&m)

    go func() {
        time.Sleep(1 * time.Second)
        c.Broadcast()
    }()

    m.Lock()
    time.Sleep(2 * time.Second)
    c.Wait()
}
Nach dem Login kopieren

Die Ausführung dieses Codes führt zu einer Deadlock-Panik, da die Goroutine auf eine Bedingung wartet, die noch nicht signalisiert wurde .

Umgehen mit der Race-Bedingung

Der richtige Ansatz zur Vermeidung dieser Race-Bedingung besteht darin, sicherzustellen, dass die sync.Mutex wird vor dem Aufruf von cond.Wait gesperrt. Dies verhindert, dass andere Goroutinen die freigegebenen Daten ändern, während die aktuelle Goroutine auf eine Bedingung wartet:

package main

import (
    "sync"
    "time"
)

func main() {
    var m sync.Mutex
    var c = sync.NewCond(&m)

    go func() {
        time.Sleep(1 * time.Second)
        m.Lock()
        c.Broadcast()
        m.Unlock()
    }()

    m.Lock()
    c.Wait()
    m.Unlock()
}
Nach dem Login kopieren

Alternative Synchronisationskonstrukte

Während sync.Cond nützlich sein kann In Szenarien, in denen mehrere Goroutinen darauf warten, dass eine gemeinsam genutzte Ressource verfügbar wird, ist es wichtig, alternative Synchronisierungsprimitive in Betracht zu ziehen. Wenn Sie beispielsweise eine Eins-zu-eins-Beziehung zwischen einem Autor und einem Leser haben, kann ein sync.Mutex für die Kommunikation ausreichen:

var sharedRsc = make(map[string]interface{})

func main() {
    m := sync.Mutex{}
    go func() {
        m.Lock()
        sharedRsc["rsc1"] = "foo"
        m.Unlock()
    }()

    m.Lock()
    fmt.Println(sharedRsc["rsc1"])
    m.Unlock()
}
Nach dem Login kopieren

In Fällen, in denen mehrere Leser beteiligt sind, bieten Kanäle eine effizientere Lösung und skalierbare Lösung für die Weitergabe von Daten.

Das obige ist der detaillierte Inhalt vonWie vermeide ich Race Conditions, wenn ich sync.Cond für bedingtes Warten verwende?. 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