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