让我蛋疼的goroutine

thinkingbullet · 2013-05-29 01:30:33 · 3463 次点击

并行的程序执行顺序不可测

#2
更多评论

你的代码看的我也挺蛋疼的

当你运行go f()后,可以理解为新开了一条支线来跑f()方法,主线还在继续跑

分析你说的两种情况

 1. Print在先
    主线在执行Print时,支线在执行`c <- 0`,所以a还是空的,所以打印是空
 2. <-在先
    主线是阻塞状态,必须等管道c里有内容后才会继续执行
    所以支线的`c <- 0`执行后,主线的`<-c`才会执行
    主线`<-c`执行时,支线正在执行`a = "hello, world"`
    然后主线就能正确打印出hello world了

这是假设所有执行的时间都一样的前提下 如果有某行代码需要执行时间比较长,那结果也会不同

#1

你开的chan是有缓冲的,不阻塞,结果就不可预测了。

#3