Dalam kod Go di bawah, pembolehubah v selalunya kurang daripada yang dijangkakan. kepada peletakan wg.Add() 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>
wg.Add() hendaklah sentiasa dipanggil sebelum melancarkan goroutine yang sepadan untuk memastikan bahawa goroutine utama menghalang sehingga semua goroutine telah melaksanakan wg.Done().
<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>
Apabila wg.Add() diletakkan di dalam goroutine, ia tidak dapat menjamin bahawa goroutine utama akan menyekat sehingga semua goroutine selesai . Ini kerana goroutine berjalan serentak dan susunan pelaksanaan adalah tidak pasti.
Dengan meletakkan wg.Add() sebelum goroutine, kami memastikan bahawa goroutine utama memanggil wg.Add() 100 kali sebelum mencapai wg.Tunggu(). Ini memastikan bahawa goroutine utama menyekat sehingga semua 100 goroutine telah memanggil wg.Done(), menyebabkan v menjadi secara konsisten bersamaan dengan 100.
Apabila menggunakan sync.WaitGroup, ikuti ini garis panduan:
Atas ialah kandungan terperinci Mengapa Peletakan wg.Add() Penting untuk Penyegerakan Dijamin dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!