Go易产生的并发Bug记录

参考地址:https://gocn.vip/topics/12529
持续记录中。。。

1. 该 bug 来自 etcd 项目,由于误用 WaitGroup 导致的非阻塞 bug

1 func(p *peer) send() {
2       p.mu.Lock()
3       defer p.mu.Unlock()
4       switch p.status {
5           case idle:
6 +         p.wg.Add(1)
7               go func() {
8 -             p.wg.Add(1)
9                   ...
10              p.wg.Done()
11          }()
12      case stopped:
13  }
14 }
15 func (p *peer) stop() {
16      p.mu.Lock()
17      p.status = stopped
18      p.mu.Unlock()
19      p.wg.Wait()
20 }

该 bug 中,在第 8 行的 Add 函数不一定能够保证在第 19 行的 Wait 语句之前执行。修复方法是将第 8 行的 Wait 函数移动到第 6 行,这样就能保证 Add 函数一定能在 Wait 函数之前运行。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值