Garis Masalah Awal:
Percubaan untuk menggunakan penyegerakan.Cond menghasilkan keadaan perlumbaan, menyebabkan panik serta-merta kerana kebuntuan. Pembangun mengesyaki isu antara mengunci Mutex dan menggunakan kaedah Tunggu syarat.
Penjelasan Kes Penggunaan Yang Dimaksudkan:
Selain daripada keadaan perlumbaan, matlamat utama adalah untuk mencipta mekanisme penyegerakan di mana berbilang goroutine menunggu pengepala HTTP tersedia daripada muat turun yang lama goroutine.
Penyelesaian:
Contoh dengan Berbilang Pembaca dan Satu Penulis:
var sharedRsc = make(map[string]interface{}) func main() { var wg sync.WaitGroup wg.Add(2) m := sync.Mutex{} c := sync.NewCond(&m) go func() { c.L.Lock() for len(sharedRsc) == 0 { c.Wait() } fmt.Println(sharedRsc["rsc1"]) c.L.Unlock() wg.Done() }() go func() { c.L.Lock() for len(sharedRsc) == 0 { c.Wait() } fmt.Println(sharedRsc["rsc2"]) c.L.Unlock() wg.Done() }() c.L.Lock() sharedRsc["rsc1"] = "foo" sharedRsc["rsc2"] = "bar" c.Broadcast() c.L.Unlock() wg.Wait() }
Penyelesaian Alternatif:
Jika menggunakan saluran boleh dilaksanakan dalam situasi ini, ia masih merupakan kaedah pilihan untuk menghantar data sekeliling.
Atas ialah kandungan terperinci Bila hendak menggunakan sync.Cond vs. Simple Locking: Masalah dengan sync.Cond dan Penyelesaian Alternatif. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!