Mengapa Peletakan wg.Add() Penting untuk Penyegerakan Dijamin dalam Go?

DDD
Lepaskan: 2024-10-27 20:40:03
asal
742 orang telah melayarinya

Why is wg.Add() Placement Crucial for Guaranteed Synchronization in Go?

Kedudukan wg.Add() untuk Penyegerakan Dijamin

Masalah

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

Penyelesaian

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

Penjelasan

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.

Amalan Terbaik

Apabila menggunakan sync.WaitGroup, ikuti ini garis panduan:

  • Panggil wg.Add() dalam goroutine "asal" sebelum memulakan goroutine baharu menggunakan go.
  • Gunakan penyata tangguh untuk memanggil wg.Done() untuk memastikan ia dipanggil walaupun panik goroutine.
  • Apabila menghantar wg ke fungsi lain, hantar penuding untuk mengelakkan membuat salinan struct wg.

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!

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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan