一道看似简单的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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容