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
Lepaskan: 2024-02-13 18:06:10
ke hadapan
892 orang telah melayarinya

为什么在这个 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()
}
Salin selepas log masuk

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!

sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan