In diesem Golang-Beispiel liegt der Grund, warum bei den im Mutex-Teil enthaltenen Bedingungen kein Deadlock auftritt, darin, dass der Mutex den Zugriff auf gemeinsam genutzte Ressourcen über die Methoden „Lock()“ und „Unlock()“ implementiert, die sich gegenseitig ausschließen . Wenn eine Goroutine die Methode „Lock()“ aufruft und der Mutex bereits von einer anderen Goroutine gesperrt ist, wird die Goroutine blockiert, bis der Mutex freigegeben wird. Dieser Blockierungsmechanismus stellt sicher, dass bei gesperrtem Mutex nicht mehrere Goroutinen gleichzeitig auf gemeinsam genutzte Ressourcen zugreifen, wodurch das Auftreten eines Deadlocks vermieden wird. In diesem Beispiel wird die Bedingung aufgrund der korrekten Verwendung von Mutex nicht blockiert.
Dieses Beispiel habe ich während einer Schulung bei O'Reilly gesehen. Es gibt eine Bedingung, die verhindern soll, dass widgetInventory negativ wird. Das Beispiel funktioniert, aber ich verstehe nicht, warum das Programm nicht blockiert, wenn makeSales den Mutex erhält und widgetInventory 0 ist.
var ( wg sync.WaitGroup mutex = sync.Mutex{} widgetInventory int32= 1000 newPurchase = sync.NewCond(&mutex) ) func main() { fmt.Println("Starting inventory count = ", widgetInventory) wg.Add(2) go makeSales() go newPurchases() wg.Wait() fmt.Println("Ending inventory count = ", widgetInventory) } func makeSales() { for i := 0; i < 3000; i++ { mutex.Lock() if widgetInventory-100 < 0{ newPurchase.Wait() } widgetInventory -= 100 fmt.Println(widgetInventory) mutex.Unlock() } wg.Done() } func newPurchases() { for i := 0; i < 3000; i++ { mutex.Lock() widgetInventory+= 100 fmt.Println(widgetInventory) newPurchase.Signal() mutex.Unlock() } wg.Done() }
Ich habe erwartet, dass der Code blockiert, wenn makeSales den Mutex erhält und widgetInventory 0 ist.
Mir ist nicht aufgefallen, dass die Bedingung mit dem Mutex zusammenhängt:
newPurchase =sync.NewCond(&mutex)
Durch Eingabe von .Wait() wird der Mutex entsperrt und versucht, ihn erneut abzurufen, wenn das Bedingungssignal empfangen wird.
condition.Wait() funktioniert nur beim Erwerb eines Mutex, funktioniert also auf Kosten von weniger lesbarem Code :-)
Das obige ist der detaillierte Inhalt vonWarum führt die im Mutex-Teil enthaltene Bedingung in diesem Golang-Beispiel nicht zu einem Deadlock?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!