Rumah >pembangunan bahagian belakang >Golang >Di Mana Anda Harus Letakkan `wg.Add()` dan `wg.Done()` untuk Penyegerakan Goroutine yang Betul dalam Go?

Di Mana Anda Harus Letakkan `wg.Add()` dan `wg.Done()` untuk Penyegerakan Goroutine yang Betul dalam Go?

Susan Sarandon
Susan Sarandonasal
2024-11-04 05:28:29869semak imbas

 Where Should You Place `wg.Add()` and `wg.Done()` for Correct Goroutine Synchronization in Go?

Penempatan Sisipan WaitGroup untuk Penyegerakan Goroutine

Dalam Go, jenis penyegerakan.WaitGroup memudahkan penyegerakan antara goroutine dengan menjejaki bilangan aktif gorouti dan menunggu sehingga semua gorouti selesai pelaksanaannya sebelum meneruskan lebih jauh. Peletakan panggilan wg.Add() dan wg.Done() yang betul adalah penting untuk memastikan kelakuan yang betul.

Pertimbangkan kod berikut:

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

Dalam contoh ini, wg.Add( 1) tersilap diletakkan dalam fungsi tanpa nama. Peletakan yang salah ini boleh menyebabkan nilai v yang tidak konsisten, selalunya kurang daripada 100.

Punca percanggahan ini terletak pada sifat serentak goroutin. Apabila diletakkan dalam goroutine, wg.Add(1) boleh dijalankan serentak dengan wg.Done(), menyebabkan wg.Wait() disambung semula lebih awal dan memandang rendah bilangan goroutine yang telah siap.

Untuk menangani isu ini, wg.Add(1) hendaklah diletakkan dalam gelung for sebelum melancarkan setiap goroutine:

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

Pelarasan ini memastikan wg.Wait() akan menyekat sehingga semua panggilan wg.Done() telah dibuat, membenarkan v mencerminkan dengan tepat bilangan goroutine yang telah siap.

Ringkasnya, sentiasa letakkan wg.Add() sebelum melancarkan goroutine dan wg.Done() sebaik sahaja goroutine melengkapkan pelaksanaannya untuk memastikan penyegerakan yang betul dan hasil yang boleh dipercayai pengiraan.

Atas ialah kandungan terperinci Di Mana Anda Harus Letakkan `wg.Add()` dan `wg.Done()` untuk Penyegerakan Goroutine yang Betul dalam Go?. 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