Rumah >pembangunan bahagian belakang >Golang >Mengapakah keadaan yang terkandung dalam bahagian mutex tidak menemui jalan buntu dalam contoh golang ini?

Mengapakah keadaan yang terkandung dalam bahagian mutex tidak menemui jalan buntu dalam contoh golang ini?

WBOY
WBOYke hadapan
2024-02-13 18:06:10912semak imbas

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

Dalam contoh golang ini, sebab kebuntuan tidak akan berlaku dengan syarat yang terkandung dalam bahagian mutex adalah kerana mutex melaksanakan akses kepada sumber yang dikongsi melalui kaedah `Lock()` dan `Unlock()` Akses saling eksklusif . Apabila goroutine memanggil kaedah `Lock()`, jika mutex sudah dikunci oleh goroutine lain, goroutine akan disekat sehingga mutex dilepaskan. Mekanisme penyekatan ini memastikan bahawa apabila mutex dikunci, berbilang goroutine tidak akan mengakses sumber yang dikongsi pada masa yang sama, dengan itu mengelakkan berlakunya kebuntuan. Jadi dalam contoh ini, disebabkan penggunaan mutex yang betul, keadaan tidak akan menemui jalan buntu.

Kandungan soalan

Saya melihat contoh ini semasa latihan di O'Reilly. Terdapat syarat yang harus menghalang widgetInventori daripada menjadi negatif. Contoh ini berfungsi, tetapi saya tidak faham mengapa program tidak menemui jalan buntu apabila makeSales mendapat mutex dan widgetInventory ialah 0.

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

Saya menjangkakan kod akan buntu apabila makeSales mendapat mutex dan widgetInventori ialah 0.

Penyelesaian

Saya tidak perasan bahawa keadaan itu dikaitkan dengan mutex: newPurchase =sync.NewCond(&mutex) Memasuki .Wait() membuka kunci mutex dan cuba mendapatkannya semula apabila isyarat keadaan diterima.

condition.Wait() hanya berfungsi apabila memperoleh mutex, jadi ia berfungsi pada kos kod yang kurang boleh dibaca :-)

Atas ialah kandungan terperinci Mengapakah keadaan yang terkandung dalam bahagian mutex tidak menemui jalan buntu dalam contoh golang ini?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam