Bagaimana untuk Mengelakkan Kebuntuan Apabila Menggunakan sync.WaitGroup dengan Fungsi Luaran?

Mary-Kate Olsen
Lepaskan: 2024-11-06 05:06:02
asal
592 orang telah melayarinya

How to Avoid Deadlock When Using sync.WaitGroup with an External Function?

Penggunaan penyegerakan yang optimum.WaitGroup dengan Fungsi Luaran

Isu:

Melaksanakan penyegerakan. WaitGroup dengan fungsi luaran menyebabkan kebuntuan apabila cuba mencetak nombor 1 hingga 11. Khususnya, ralat berlaku pada baris wg.Wait().

Penyelesaian 1 (Pendekatan Salah):

Menetapkan wg.Add(1) dan bukannya 2 ialah penyelesaian yang salah, kerana ia tidak menangani isu asas.

Penyelesaian 2 (Pendekatan Diperbaik):

Ubah suai kod seperti berikut:

  • Dalam fungsi utama, hantar alamat penyegerakan.WaitGroup ke fungsi Cetak menggunakan &wg.
  • Alih keluar wg parameter daripada tandatangan fungsi Cetak.
<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)

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

    wg.Wait() //deadlock here
}                

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

Penjelasan:

Mengirim alamat wg ke Print memastikan bahawa contoh WaitGroup yang sama sedang dimanipulasi. Mengalih keluar wg daripada tandatangan fungsi Cetak menghapuskan keperluan untuk fungsi mengetahui tentang WaitGroup luaran.

Kesimpulan:

Penyelesaian kedua ialah pendekatan yang lebih mantap yang mengelakkan kebuntuan dan mengekalkan kebebasan fungsi Cetak daripada wg.

Atas ialah kandungan terperinci Bagaimana untuk Mengelakkan Kebuntuan Apabila Menggunakan sync.WaitGroup dengan Fungsi Luaran?. 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
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!