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?

WBOY
Freigeben: 2024-02-13 18:06:10
nach vorne
897 Leute haben es durchsucht

为什么在这个 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()
}
Nach dem Login kopieren

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!

Quelle:stackoverflow.com
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