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.
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.
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!