Rumah >pembangunan bahagian belakang >Golang >Mengapakah menggunakan `sync.WaitGroup` dengan fungsi luaran membawa kepada kebuntuan?

Mengapakah menggunakan `sync.WaitGroup` dengan fungsi luaran membawa kepada kebuntuan?

Linda Hamilton
Linda Hamiltonasal
2024-11-06 00:50:02866semak imbas

Why does using `sync.WaitGroup` with external functions lead to a deadlock?

Amalan Terbaik untuk Menggunakan penyegerakan.WaitGroup dengan Fungsi Luaran

Dalam coretan kod yang disediakan, anda menghadapi kebuntuan apabila cuba menggunakan penyegerakan .WaitGroup dengan fungsi luaran. Ralat berpunca daripada menghantar salinan WaitGroup kepada fungsi luaran secara salah, menyebabkan kaedah Done() tidak digunakan pada WaitGroup yang dimaksudkan.

Untuk menangani isu ini, pastikan anda menghantar penunjuk ke WaitGroup sebaliknya. Dengan berbuat demikian, fungsi luaran boleh mengakses WaitGroup yang betul dan memanggil Done() dengan sewajarnya. Berikut ialah kod yang diperbetulkan:

<code class="go">package main

import (
    "fmt"
    "sync"
)

func main() {
    ch := make(chan int)

    var wg sync.WaitGroup
    wg.Add(2)

    go Print(ch, &wg) // Pass a pointer to the WaitGroup

    go func() {
        for i := 1; i <= 11; i++ {
            ch <- i
        }
        close(ch)
        defer wg.Done()
    }()

    wg.Wait() // Wait for both goroutines to finish
}

func Print(ch <-chan int, wg *sync.WaitGroup) {
    for n := range ch { // Read from the channel until it's closed
        fmt.Println(n)
    }
    defer wg.Done()
}</code>

Sebagai alternatif, anda boleh mengubah suai tandatangan fungsi Cetak untuk mengalih keluar parameter WaitGroup, seperti yang ditunjukkan di bawah:

<code class="go">func Print(ch <-chan int) {
    for n := range ch { // Read from the channel until it's closed
        fmt.Println(n)
    }
}</code>

Dalam kes ini, Print fungsi bertanggungjawab untuk menutup WaitGroup apabila ia selesai. Pendekatan ini lebih disukai dalam senario di mana fungsi luaran tidak memerlukan akses terus ke WaitGroup.

Atas ialah kandungan terperinci Mengapakah menggunakan `sync.WaitGroup` dengan fungsi luaran membawa kepada kebuntuan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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