Rumah > pembangunan bahagian belakang > Golang > Mengapa Melepasi Struktur WaitGroup mengikut Nilai Menyebabkan Kebuntuan dalam Komunikasi Saluran Go?

Mengapa Melepasi Struktur WaitGroup mengikut Nilai Menyebabkan Kebuntuan dalam Komunikasi Saluran Go?

Patricia Arquette
Lepaskan: 2024-10-29 07:47:02
asal
401 orang telah melayarinya

Why Does Passing a WaitGroup Structure by Value Cause a Deadlock in Go Channel Communication?

Kebuntuan dalam Komunikasi Saluran Go Kerana Melepasi Struktur Mengikut Nilai

Dalam kod anda, anda telah mengalami ralat kebuntuan dalam saluran goroutine anda komunikasi. Ralat ini adalah kerana anda menghantar struktur WaitGroup mengikut nilai kepada gorouti anda, yang mencipta salinan WaitGroup dan bukannya berkongsi rujukan asal.

Mengapa Melepasi Nilai Menyebabkan Kebuntuan

Struktur dalam Go diluluskan mengikut nilai, bukan dengan rujukan. Apabila anda menghantar struktur kepada fungsi, salinan dibuat dan diteruskan ke fungsi tersebut. Ini bermakna sebarang perubahan yang dibuat pada struktur dalam fungsi tidak akan ditunjukkan dalam struktur asal di luar fungsi.

Dalam kes anda, goroutine cuba memberi isyarat kepada WaitGroup apabila mereka menyelesaikan tugas mereka. Walau bagaimanapun, memandangkan mereka menggunakan salinan WaitGroup, panggilan Done() mereka tidak menjejaskan WaitGroup yang asal. Akibatnya, panggilan Tunggu() dalam goroutine utama tidak pernah selesai, membawa kepada kebuntuan.

Penyelesaian: Melewati Penunjuk

Untuk menyelesaikan isu ini, anda perlu menghantar WaitGroup ke goroutine anda dengan penunjuk. Ini memastikan bahawa kedua-dua goroutine dan goroutine utama berkongsi rujukan yang sama kepada WaitGroup.

Contoh Berfungsi:

Berikut ialah versi kod anda yang diperbetulkan:

<code class="go">package main

import (
    "fmt"
    "sync"
)

func push(c chan int, wg *sync.WaitGroup) {
    for i := 0; i < 5; i++ {
        c <- i
    }
    wg.Done()
}

func pull(c chan int, wg *sync.WaitGroup) {
    for i := 0; i < 5; i++ {
        result, ok := <-c
        fmt.Println(result, ok)
    }
    wg.Done()
}

func main() {
    var wg sync.WaitGroup
    wg.Add(2)
    c := make(chan int)

    go push(c, &wg)
    go pull(c, &wg)

    wg.Wait()
}</code>
Salin selepas log masuk

Sekarang, apabila anda menjalankan kod ini, anda seharusnya tidak lagi menghadapi ralat kebuntuan. Goroutine akan berjaya memberi isyarat kepada WaitGroup dan goroutine utama akan dapat menyelesaikan pelaksanaannya.

Atas ialah kandungan terperinci Mengapa Melepasi Struktur WaitGroup mengikut Nilai Menyebabkan Kebuntuan dalam Komunikasi Saluran Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
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