关于 goroutine 的一个小问题

2018-02-07 17:42:30 +08:00
 kangkang
代码如下:
https://gist.github.com/leo1971/20a4eb3260a1e4a1c68a916c01257c89

sum 函数对传入的数组做累加,main 开了两个 goroutine 分别将两个数组传入 sum 函数,按理说输出应该是
17 -5 12

但是我在第一个 goroutine 后面再加一个延时之后,结果就变成了
-5 17 12

所以,我的问题是,为什么会这样啊...
1709 次点击
所在节点    Go 编程语言
17 条回复
myself659
2018-02-07 17:50:37 +08:00
goroutine 执行顺序与代码顺序并不关联,如果你要看到效果,建议将 sleep 时间加大
kangkang
2018-02-07 17:53:49 +08:00
@myself659 放再大都是-5 17..而且我觉得对于这种小小的代码,执行顺序还是有关系的啊,谁先执行谁就先进 channel,也就是先被 print,不是这样吗
brucemaclin
2018-02-07 18:01:54 +08:00
代码问题吧 sum(s[len(s)/2:], c) 明明先传的后半部分。
myself659
2018-02-07 19:17:04 +08:00
@brucemaclin 正解
kangkang
2018-02-07 20:15:29 +08:00
@brucemaclin 是的,这是我的错误。但是如果把延时去掉,结果会反过来,这又如何解释呢
willchen
2018-02-07 20:40:41 +08:00
应该是切片时间导致的 s[len(s)/2:] 的 时间 大于 s[:len(s)/2] 的时间
Jevan
2018-02-07 20:50:23 +08:00
@kangkang #5 没有吧,我刚都试了试,怎么样,结果都是-5 17 12。



goofool
2018-02-07 21:23:47 +08:00
sum 时间复杂度都是一样的,正常就是应该最早创建的 goroutine 先返回啊,就是-5 17 12
sunsh2017
2018-02-08 01:45:55 +08:00
mark
kangkang
2018-02-08 02:24:07 +08:00
@Jevan
@goofool
@willchen
感谢回答,我怀疑是我测试用的官方 playground 的原因,明天换到本地编译试试
hqlyz
2018-02-08 09:24:02 +08:00
@kangkang 我在本地测试结果与你的一样,猜测同时开启 2 个 goroutine 返回结果的顺序是不确定的,不同的机器会有不同结果表现
kangkang
2018-02-08 14:21:26 +08:00
@willchen make sense.但是为什么时间会不一样呢
willchen
2018-02-08 14:47:39 +08:00
@kangkang hhh 瞎说的 不对不对
willchen
2018-02-08 15:01:09 +08:00
@kangkang 跟 Goroutine 调度器有关 其实是 随机的
kangkang
2018-02-08 15:09:57 +08:00
@willchen 不是啊,不改代码的话,重复 n 次都是一样的结果
willchen
2018-02-08 16:08:17 +08:00
@kangkang 我写了个循环 还是有小概率出现另一种情况的 你试试
nekoyaki
2018-02-23 13:07:03 +08:00
@kangkang
正确的理解是,“不要对多个 goroutine 的执行顺序做任何的假设、不要试图去解释多个并发 goroutine 实际的顺序问题。”。
按目前的实现上,你高概率会测出一样的结果,但是在其他的机器、其他的代码、其他的环境、其他版本的 golang 上,这些顺序是不保证的。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/429254

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX