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
Lepaskan: 2024-11-06 00:50:02
asal
901 orang telah melayarinya

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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!

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