Go channel同步

我们可以使用Channel来同步不同goroutines的执行。看下面的代码:

package main

 

import "fmt"

import "time"

 

//这个函数会在新的goroutine中运行,执行结束时会给done channel中传入值true

//注意到中间有sleep了一秒

func worker(done chan bool) {

fmt.Print("working...")

time.Sleep(time.Second)

fmt.Println("done")

 

//channel中传入值true

done <- true

}

 

func main() {

 

//创建一个channel,用于goroutine之间通知情况

done := make(chan bool, 1)

//开启goroutine,并把done channel传进去

go worker(done)

 

//如果done channel中一直没有数据,这里就会卡住,直到worker结束时传入值以后,这里才会继续执行

<-done

}

 

 

运行结果:


working...done

 

如果我们把main函数最后一句代码:<-done,去掉以后,不会输出任何数据。

因为主线程已经执行完退出了,goroutine依赖于主现程,也会退出。用古话说是:

皮之不存,毛將焉附?

覆巢之下,安有完卵?

国之不存,何以家为?

 

问题:

A主线程启动B1 B2 两个goroutine,B1 启动了C11 C12两个goroutine。如果B1执行结束,C11 C12会退出吗?

结论:不会

posted @ 2015-03-04 10:54  klain  阅读(1178)  评论(0编辑  收藏  举报