一道流传的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语句函数的执行顺序就乱了呢?

潇潇雨雨
浏览 1359回答 2
2回答

胡说叔叔

你这拷贝的没错吗?第一个loop里面的func用的是out scope的i?那么这个i应该是不会变的啊。另外GOMAXPROCS不能保证顺序,只能保证用户代码用几个线程跑,1不代表顺序!要知道并发不等于平行(中文真不好翻: concurrent is not parallel)
打开App,查看更多内容
随时随地看视频慕课网APP