Rumah > pembangunan bahagian belakang > Golang > Mengapakah Operasi Saluran Berantai dalam Penyata `pilih` Go Membawa kepada Kebuntuan?

Mengapakah Operasi Saluran Berantai dalam Penyata `pilih` Go Membawa kepada Kebuntuan?

Mary-Kate Olsen
Lepaskan: 2024-11-22 05:37:22
asal
674 orang telah melayarinya

Why Do Chained Channel Operations in Go's `select` Statement Lead to Deadlock?

Operasi Saluran Berantai dalam Kes Terpilih: Memahami Kebuntuan

In Go, fungsi fanIn mengagregatkan nilai daripada berbilang saluran input ke dalam satu output saluran, menyediakan satu bentuk pemultipleksan. Pernyataan pilih dalam fungsi fanIn menggunakan operasi tidak menyekat <- untuk membaca daripada berbilang saluran input secara serentak.

Walau bagaimanapun, jika pernyataan pilih diubah suai untuk memasukkan operasi saluran berantai, seperti:

select {
    case ch <- <-input1:
    case ch <- <-input2:
}
Salin selepas log masuk

kelakuan aneh boleh berlaku. Sesetengah nilai mungkin digugurkan, membawa kepada jalan buntu.

Untuk memahami sebab ini berlaku, adalah penting untuk diingat bahawa dalam pernyataan pilihan, hanya satu saluran operasi baca atau tulis tidak menyekat. Yang lain berkelakuan seolah-olah operator blok telah digunakan.

Dalam fungsi fanIn yang diubah suai, kes pertama membaca nilai daripada input1 dan cuba menulisnya ke ch dengan cara yang tidak menyekat. Ini boleh berjaya jika fungsi utama menggunakan nilai dengan segera. Walau bagaimanapun, terdapat kemungkinan kecil bahawa gelung fungsi utama mungkin tidak cukup pantas untuk melakukan ini.

Dalam lelaran gelung fanIn yang berikutnya, kes kedua mungkin akan dipilih, dan pada masa ini, goroutine kedua mungkin telah menulis nilai kepada ch. Walau bagaimanapun, jika fungsi utama belum lagi menggunakan nilai daripada lelaran sebelumnya, ia akan digugurkan.

Kitaran penurunan nilai ini akhirnya membawa kepada situasi di mana tiada lagi penulis, tetapi pembaca adalah masih menunggu nilai, mengakibatkan kebuntuan.

Versi kod yang diubah suai menunjukkan isu ini dengan lebih jelas: https://play.golang.org/p/lcM5OKx09Dj

Atas ialah kandungan terperinci Mengapakah Operasi Saluran Berantai dalam Penyata `pilih` Go Membawa kepada Kebuntuan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan