一道困扰了我好久的goroutine调度面试题

1,973 阅读1分钟

程序

func main() {
	runtime.GOMAXPROCS(1)
	wg := sync.WaitGroup{}
	wg.Add(10)
	for i := 0; i < 5; i++ {
		go func() {
			fmt.Println("go routine 1 i: ", i)
			wg.Done()
		}()
	}
	for i := 0; i < 5; i++ {
		go func(i int) {
			fmt.Println("go routine 2 i: ", i)
			wg.Done()
		}(i)

	}
	wg.Wait()
}

执行结果

go routine 2 i:  4
go routine 1 i:  5
go routine 1 i:  5
go routine 1 i:  5
go routine 1 i:  5
go routine 1 i:  5
go routine 2 i:  0
go routine 2 i:  1
go routine 2 i:  2
go routine 2 i:  3

疑问?

为什么先输出

go routine 2 i:  4

我搜索了好久,真是百思不得其(jie),大神,你怎么看?

原因

最后还阅读大神的文章,发现了原因 由一个问题引发的 goroutine 相关源码的探究 简单来说,就是如果当前的G的调度时间片还有时间,就会马上执行刚刚创建的G