一道看似简单的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在下列情况下可能会交出控制权:

原文地址:https://www.cnblogs.com/zhangjinfu/p/11213916.html