让我蛋疼的goroutine

thinkingbullet · 2013-05-29 01:30:33 · 3483 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2013-05-29 01:30:33 的主题,其中的信息可能已经有所发展或是发生改变。

代码如下:

package main

import (
        "fmt"
)

var a string
var c = make(chan int, 10)

func f() {

        c <- 0
        a = "hello, world"
}

func main() {
        go f()
        fmt.Println(a)
        <-c

}

在main中把fmt.Println(a)和<-c位置交换得到的结果就不一样,这到底是为什么啊,这叫人怎么理解goroutine


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

3483 次点击  
加入收藏 微博
3 回复  |  直到 2014-03-17 03:52:24
bsdos
bsdos · #1 · 12年之前

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

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

分析你说的两种情况

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

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

Hubery
Hubery · #2 · 12年之前

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

wjlight
wjlight · #3 · 11年之前

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

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传