一道看似简单的go程序的深入分析 - Go语言中文社区

一道看似简单的go程序的深入分析


先上代码:

func main() {
    var a [10]int
    for i := 0; i < 10; i++ {
        go func(i int) {
            for {
                a[i]++
            }
        }(i)
    }
    time.Sleep(time.Millisecond)
    fmt.Println(a)
}

运行后估计大部分电脑是死循环(cpu核数大于10的会输出结果)

8核的可能有时能输出结果:7个大于0的数和3个0

有时是死循环

原因分析:

  1. goroutine是非抢占式的 除非主动交出控制权
  2. goroutine可能合用一个线程

由于这两个原因导致结果是不确定的 除非cpu核数大于10

补充:
goroutine在下列情况下可能会交出控制权:


QQ图片20180704110356.png
版权声明:本文来源简书,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://www.jianshu.com/p/1e12ebebd54c
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-01-12 12:57:21
  • 阅读 ( 687 )
  • 分类:Go

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢