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() }
変数:
関数:
main() の同時実行:
潜在的な問題:
考えられる結果
同期が欠如しているため、プログラムの出力は非決定的になります。考えられるシナリオは次のとおりです:
ケース 1: f() が a と b を変更する前に g() が実行されます:
0 0
または
ケース 2: g() の前に b = 2 が完了したが、a = 1 が完了していない場合、出力は次のようになります:
2 0
主な所見
データ競合: 同期せずに a と b に同時にアクセスすると、データ競合が発生します。これにより、プログラムの動作が未定義で予測不能になります
コードの修正
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() }
ここで、g() は、f() が Done チャネル経由でシグナルを送信するまで待機します。
以上がGO:同期が取れていないの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。