Mengapakah Peletakan `wg.Add()` Penting untuk Penyegerakan yang Betul dalam `sync.WaitGroup` Go?

Linda Hamilton
Lepaskan: 2024-10-30 01:49:02
asal
225 orang telah melayarinya

  Why is the Placement of `wg.Add()` Crucial for Proper Synchronization in Go's `sync.WaitGroup`?

Membetulkan wg.Add() Peletakan untuk WaitGroup Syncronization

Dalam Go, jenis sync.WaitGroup menyediakan penyegerakan antara goroutine. Tujuan utamanya adalah untuk membolehkan goroutine utama menunggu sekumpulan goroutine menyelesaikan tugas mereka. Walau bagaimanapun, peletakan panggilan wg.Add() adalah penting untuk memastikan penyegerakan yang betul.

Dalam contoh yang salah:

<code class="go">var wg sync.WaitGroup
var v int32 = 0
for i := 0; i < 100; i++ {
    go func() {
        wg.Add(1) // Wrong place
        atomic.AddInt32(&v, 1)
        wg.Done()
    }()
}
wg.Wait()
fmt.Println(v)</code>
Salin selepas log masuk

Panggilan wg.Add(1) diletakkan di dalam fungsi tanpa nama, yang merupakan satu kesilapan. Peletakan sesat ini boleh membawa kepada situasi di mana wg.Wait() kembali lebih awal kerana wg.Add(1) dilaksanakan selepas wg.Done() dalam goroutine yang sama. Akibatnya, v tidak akan menggambarkan dengan tepat bilangan tugasan yang telah disiapkan dan nilainya mungkin akan kurang daripada 100.

Dalam contoh yang diperbetulkan:

<code class="go">var wg sync.WaitGroup
var v int32 = 0
for i := 0; i < 100; i++ {
    wg.Add(1)
    go func() {
        atomic.AddInt32(&v, 1)
        wg.Done()
    }()
}
wg.Wait()
fmt.Println(v)</code>
Salin selepas log masuk

Wg.Add( 1) panggilan kini diletakkan di luar fungsi tanpa nama, memastikan bahawa goroutine utama telah menggunakan semua 100 goroutine dan mendaftarkan tugas penyiapan mereka dengan wg sebelum memanggil wg.Wait(). Peletakan yang betul ini menjamin bahawa wg.Wait() akan menyekat sehingga semua 100 goroutine telah menyelesaikan tugas mereka, menghasilkan nilai yang tepat bagi v.

Peraturan Am untuk Menggunakan sync.WaitGroup:

Untuk memastikan penyegerakan berjaya menggunakan penyegerakan.WaitGroup, ikut garis panduan ini:

  • Sentiasa hubungi wg.Add() dalam goroutine utama sebelum memulakan goroutine baharu.
  • Adalah disyorkan untuk memanggil wg.Done() menggunakan pernyataan tangguh untuk memastikan ia dilaksanakan walaupun sekiranya berlaku panik goroutine.
  • Apabila menghantar penyegerakan.WaitGroup ke fungsi lain (elakkan menggunakan pembolehubah peringkat pakej ), hantar penuding kepadanya untuk mengelakkan penyalinan dan memastikan semua perubahan dibuat kepada penyegerakan asal.WaitGroup.

Atas ialah kandungan terperinci Mengapakah Peletakan `wg.Add()` Penting untuk Penyegerakan yang Betul dalam `sync.WaitGroup` 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