🐷

panic: sync: negative WaitGroup counterでパニックになった話

2022/07/05に公開

表題の通り

エラーに出会った話

goでgoroutineを見様見真似で書いていたらエラーが出てきた

panic: sync: negative WaitGroup counter

調べても中々わかりやすい解答に出会わなかったので、ちょっと戸惑った

よくよく考えれば当然の話だった

goroutineをWaitGroupで待ち合わせる場合

  1. WaitGroup.add({追加する分の整数値})を実行する。
  2. 処理が終わったらWaitGroup.Done()でその数を減らす
  3. WaitGroup.wait()では0になるように待つ

という処理なわけですが、この構成上WaitGroupのカウンターは負の値を取り得ないので、そこでエラーが起きたのが原因でした

//正常な書き方
var wg = new(sync.WaitGroup)
wg.Add(1)//インクリメントする
go func(innerwg sync.WaitGroup) {
	defer innerwg.Done()//処理が終わったらDoneにする(デクリメント)	
	//なにかの処理を入れる

	}(wg)

wg.Wait()

//エラーが起きる場合
wg.Add(1)
go func(innerwg sync.WaitGroup) {
	defer innerwg.Done()	
	
	//処理を入れる
	innerwg.Done()//余計にDoneさせてマイナスさせるとエラー		

	}(wg)

wg.Wait()


wgはデクリメントが足りていないと止まるし、しすぎてもエラーになるという話でした。

おわりに

やっぱり見たものを見たままでやるとこんな単純なところでも引っかかるということがよくわかりました。

goroutineは上手く使うと色々な並行処理がスムーズに書けそうなので勉強する価値がありそうです

Discussion