Heim >Backend-Entwicklung >Golang >Warum führt die im Mutex-Teil enthaltene Bedingung in diesem Golang-Beispiel nicht zu einem Deadlock?

Warum führt die im Mutex-Teil enthaltene Bedingung in diesem Golang-Beispiel nicht zu einem Deadlock?

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBnach vorne
2024-02-13 18:06:10921Durchsuche

为什么在这个 golang 示例中,互斥体部分中包含的条件不会出现死锁?

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.

Frageninhalt

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.

Problemumgehung

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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen