Konsep pengecualian bersama mengawal pelaksanaan fungsi atau sekatan kod secara serentak dalam program. Dalam persekitaran pengaturcaraan serentak, di mana berbilang rutin dilaksanakan secara berasingan, mengekalkan pengecualian bersama adalah penting untuk memastikan ketepatan dan mencegah konflik.
Masalah:
Pertimbangkan senario dengan tiga goroutin serentak (Rutin 1, 2, dan 3), yang menukar data dan melaksanakan operasi pencetakan. Matlamatnya adalah untuk memastikan bahawa semasa bahagian kod tertentu dalam mana-mana goroutine sedang dilaksanakan, pelaksanaan dalam goroutine lain dihentikan, sehingga bahagian ini selesai.
Penyelesaian Menggunakan Mutex:
Mutexes , primitif penyegerakan asas, boleh digunakan untuk mencapai pengecualian bersama dalam goroutine. Mutexes menyediakan mekanisme penguncian yang membenarkan hanya satu goroutine mengakses bahagian kritikal kod pada satu masa.
Dalam coretan kod yang disediakan, tiga mutex (mutex1, mutex2 dan mutex3) telah diperkenalkan:
var ( mutex1, mutex2, mutex3 sync.Mutex wg sync.WaitGroup )
Setiap goroutine memperoleh mutex yang sesuai sebelum melaksanakan bahagian kritikal, seperti yang ditunjukkan dalam kod yang disemak:
func Routine1() { mutex1.Lock() // do something ... // do something mutex1.Unlock() ... } func Routine2() { mutex2.Lock() ... // do something ... mutex2.Unlock() ... } func Routine3() { ... mutex3.Lock() // do something ... mutex3.Unlock() ... }
Kumpulan Tunggu dan Penyegerakan:
Selain itu, kumpulan tunggu (wg) telah digunakan untuk menyegerakkan goroutine:
wg.Add(3) go Routine1() go Routine2() Routine3() wg.Wait()
Keputusan:
Dengan pelaksanaan ini, pelaksanaan bahagian kritikal dalam goroutine akan saling eksklusif. Akibatnya, operasi pencetakan dalam setiap rutin tidak akan bertindih atau bersilang, menghalang keadaan perlumbaan dan menghasilkan output yang dijangkakan.
Atas ialah kandungan terperinci Bagaimanakah anda boleh mencapai pengecualian bersama dalam Goroutines serentak menggunakan Mutexes?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!