一道流传的go面试题

func test_gomaxprocs() {
    runtime.GOMAXPROCS(1)
    wg := sync.WaitGroup{}
    wg.Add(20)

    for i := 0; i < 10; i++ {
        go func() {
            fmt.Println("i:", i)
            defer wg.Done()
        }()
    }
    for i := 0; i < 10; i++ {
        go func(i int) {
            fmt.Println("j: ", i)
            defer wg.Done()
        }(i)
    }
    //sleep
    wg.Wait()
}

我google到一个外国人写的文章,说设置CPU数目为1后,go语句函数是按顺序依次执行的。 我在wg.Wait()前sleep下,得到的输出确实是依次执行的。但是我疑惑的是,为什么已进入wg.Wait(),go语句函数的执行顺序就乱了呢?

阅读 7.6k
3 个回答

这个问题,time.Sleep应该是在main goroutine里执行的,至于顺序是goroutine内部调度问题,CPU到底分给了哪个goroutine这个内部控制的。这个结果和是否执行sleep应该没有必然的联系。
至于Go的调度器相关,可以看下这个文档:https://www.douban.com/note/3...

你这拷贝的没错吗?第一个loop里面的func用的是out scope的i?那么这个i应该是不会变的啊。

另外GOMAXPROCS不能保证顺序,只能保证用户代码用几个线程跑,1不代表顺序!

要知道并发不等于平行(中文真不好翻: concurrent is not parallel)

当 runtime.GOMAXPROCS(1) 时,顺序为:
先执行最近的一个,也就是第二个 for 循环的最后一个值,得到9,然后再按照 go 语句的顺序执行

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题