var a string var done bool func setup() { a = "hello, world" done = true } func doprint() { if !done { once.Do(setup) } print(a) } func twoprint() { go doprint() go doprint() }
Pembolehubah:
Fungsi:
Persamaan dalam utama():
Isu Berpotensi:
Kemungkinan Hasil
Disebabkan kekurangan penyegerakan, output program adalah tidak pasti. Berikut ialah senario yang mungkin:
Kes 1: g() dilaksanakan sebelum f() mengubah suai a dan b:
0 0
atau
KES 2: Jika b = 2 selesai sebelum g() tetapi a = 1 tidak, outputnya boleh jadi:
2 0
Pemerhatian Utama
Perlumbaan Data: Akses serentak kepada a dan b tanpa penyegerakan memperkenalkan perlumbaan data. Ini menjadikan tingkah laku program tidak ditentukan dan tidak dapat diramalkan
Membetulkan Kod
var a, b int var wg sync.WaitGroup func f() { a = 1 b = 2 wg.Done() } func g() { print(b) print(a) } func main() { wg.Add(1) go f() wg.Wait() g() }
var a, b int func f(done chan bool) { a = 1 b = 2 done <- true } func g() { print(b) print(a) } func main() { done := make(chan bool) go f(done) <-done g() }
Di sini, g() menunggu sehingga f() menghantar isyarat ke atas saluran yang telah selesai.
Atas ialah kandungan terperinci GO:kekurangan penyegerakan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!