go学习笔记第四版本第67页的代码和我执行的不一致?求指导

发布于 2022-09-02 13:10:20 字数 508 浏览 10 评论 0

 69   wg := new(sync.WaitGroup)
 70   wg.Add(2)
 71   go func() {
 72     defer wg.Done()
 73     for i := 0; i < 6; i++ {
 74       println(i)
 75       if i == 3 {
 76         runtime.Gosched()
 77       }
 78     }
 79   }()
 80   go func() {
 81     defer wg.Done()
 82     println("Hello, World!")
 83   }()
 84   wg.Wait()

实际输出:
Hello, World!
0
1
2
3
4
5
但是书上67页写的是
$ go run main.go
0
1
2
3
Hello, World!
4
5
,求大侠解释

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

下壹個目標 2022-09-09 13:10:20

版本问题,GO1.5以后默认开启多核了,1.5以前默认是单核的(默认只启动一个线程),并且可能改变了调度方式,现在你手动设置只开启一个线程:runtime.GOMAXPROCS(1) 也和1.4的运行结果不一样
以下是1.5(左)和1.4(右)的运行结果
图片描述

╭⌒浅淡时光〆 2022-09-09 13:10:20

谁会去翻那本书啊,建议把那页的代码拍上来看看才知道有区别。

无敌元气妹 2022-09-09 13:10:20

你查一下 runtime.Gosched() 这个函数做了什么
看看你的语言版本 ,1.4默认单核运行,之后才是多核多线程

燕归巢 2022-09-09 13:10:20

这段代码中两个输出信息的 goroutine 之间没有做任何同步,理论上以任何顺序输出都是有可能的啊,不应对输出的结果做出期望。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文