Kebuntuan ialah keadaan dalam pengaturcaraan serentak di mana berbilang proses atau utas menunggu antara satu sama lain untuk melepaskan sumber, menyebabkan program tidak dapat diteruskan. Go menyediakan mekanisme berikut untuk menangani kebuntuan: Mutex dan Saluran: digunakan untuk memastikan hanya satu goroutine boleh mengakses sumber pada satu masa. Pengesanan jalan buntu: Waktu jalanan Go menyediakan pengesan jalan buntu yang akan panik apabila jalan buntu dikesan. Corak Konkurensi: Corak Konkurensi menyediakan satu set peraturan untuk mengelakkan kebuntuan.
Pengendalian kebuntuan dalam pengaturcaraan serentak berfungsi Golang
Apakah kebuntuan?
Kebuntuan ialah keadaan dalam program serentak di mana dua atau lebih proses atau utas sedang menunggu antara satu sama lain untuk melepaskan sumber, menyebabkan program tidak dapat diteruskan.
Mengendalikan kebuntuan dalam Go
Go menyediakan pelbagai mekanisme untuk menangani kebuntuan:
sync.Mutex
dan saluran boleh digunakan untuk memastikan hanya terdapat satu goroutine Akses sumber setiap masa.sync.Mutex
和通道可用于确保仅一个 goroutine 每次都能访问资源。
实战案例
考虑以下示例,其中两个 goroutine 试图彼此发送数据:
package main import ( "sync" ) func main() { var wg sync.WaitGroup ch1 := make(chan int) ch2 := make(chan int) // 发送数据到 ch1 go func() { defer wg.Done() for { ch1 <- 1 data := <-ch2 _ = data } }() // 发送数据到 ch2 go func() { defer wg.Done() for { ch2 <- 2 data := <-ch1 _ = data } }() wg.Add(2) wg.Wait() }
由于ch1
和ch2
// 使用 Mutex package main import ( "sync" ) func main() { var wg sync.WaitGroup var m sync.Mutex ch1 := make(chan int) ch2 := make(chan int) // 发送数据到 ch1 go func() { defer wg.Done() for { m.Lock() ch1 <- 1 data := <-ch2 _ = data m.Unlock() } }() // 发送数据到 ch2 go func() { defer wg.Done() for { m.Lock() ch2 <- 2 data := <-ch1 _ = data m.Unlock() } }() wg.Add(2) wg.Wait() }
ch1
dan
ch2< /code> Menunggu untuk menerima data, jadi kebuntuan akan berlaku. Untuk menyelesaikan masalah ini, anda boleh menggunakan Mutex atau saluran untuk memastikan bahawa hanya satu goroutine boleh mengakses sumber pada satu masa:
// 使用通道 package main func main() { var wg sync.WaitGroup ch1 := make(chan int) ch2 := make(chan int) // 发送数据到 ch1 go func() { defer wg.Done() for { select { case ch1 <- 1: data := <-ch2 _ = data } } }() // 发送数据到 ch2 go func() { defer wg.Done() for { select { case ch2 <- 2: data := <-ch1 _ = data } } }() wg.Add(2) wg.Wait() }
Salin selepas log masuk
rrreeeAtas ialah kandungan terperinci Pengendalian kebuntuan dalam fungsi Golang pengaturcaraan serentak. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!
Artikel sebelumnya:Amalan pemprofilan kod pengoptimuman prestasi fungsi Golang
Artikel seterusnya:Kaedah ujian prestasi dalam pengaturcaraan serentak fungsi Golang
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
Artikel terbaru oleh pengarang
-
2024-08-17 03:45:08
-
2024-08-17 03:43:08
-
2024-08-17 03:39:08
-
2024-08-17 03:37:08
-
2024-08-17 03:35:08
-
2024-08-17 03:32:08
-
2024-08-17 03:27:08
-
2024-08-17 03:26:08
-
2024-08-17 03:21:08
-
2024-08-17 03:19:08
Isu terkini
Modul tidak ditakrifkan dalam projek Vue
Saya baru sahaja mencipta aplikasi Vue baharu dengan menjalankan npmini tvue@latest sepert...
daripada 2023-11-17 12:38:53
0
2
394
Menangkap pengecualian Guzzle
Saya cuba menangkap pengecualian dalam set ujian yang dijalankan pada API yang saya bangun...
daripada 2023-11-16 14:36:03
0
12
290
Topik-topik yang berkaitan
Lagi>
- Bagaimana untuk menentukan pembolehubah dalam golang
- Apakah kaedah penukaran data dalam golang?
- Apakah perpustakaan yang biasa digunakan di golang?
- Apakah perbezaan antara golang dan ular sawa
- tutorial vba
- Bagaimana untuk menyemak sama ada kata laluan mysql terlupa
- Kad grafik gred peminat
- permainan ipad tiada bunyi
Cadangan popular
Tutorial Popular
Lagi>
-
-
-
Tutorial Video Permulaan JAVA
2348012
-
-
Muat turun terkini
Lagi>
-
-
-
-
-
-
-
-
-
Tentang kita
Penafian
Sitemap
-
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!