为什么这两种声明会有不同的结果?

WalkerLiuFei · 2018-11-27 21:08:58 · 1414 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2018-11-27 21:08:58 的主题,其中的信息可能已经有所发展或是发生改变。

func TestConcurrent(t *testing.T) {
    wg := sync.WaitGroup{}
    wg.Add(20)
    for count := 20; count >= 0; count-- {
        go func(count int) {
            fmt.Println(count)
            defer wg.Done()
        }(count)
    }
    wg.Wait()
}

// 会抛出wg 至负数的异常 下面这种通过限制 processor 数量都可以规避。 为什么???

func TestConcurrent(t *testing.T) {
    runtime.GOMAXPROCS(1)
    wg := sync.WaitGroup{}
    wg.Add(20)
    for count := 20; count >= 0; count-- {
        go func(count int) {
            fmt.Println(count)
            defer wg.Done()
        }(count)
    }
    wg.Wait()
}

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1414 次点击  
加入收藏 微博
3 回复  |  直到 2018-11-29 10:09:24
weiwg521
weiwg521 · #1 · 6年之前

wg.Add(20)等待20次,但是你的for count := 20; count >= 0; count--{}循环有21次。 main函数的wg.Wait()等到20次wg.Done()就会结束整个程序,不管你的goroutine并发还在没在执行,不信你把for改成50次循环试试。runtime.NumCPU()查看是几个核心的cpu 但是有一种情况假如main函数所在线程还没来得及结束,你for循环里的第21次goroutine线程已经进入执行就会导致wg计数为负数引发panic。 当然你设为1个goroutine运行的时候是单线程,就跟顺序执行差不多,可以及时结束不会进入第21次循环。

xixihaha
xixihaha · #2 · 6年之前

666

Joyboo
Joyboo · #3 · 6年之前

不是应该把wg的指针传进去吗

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传