关于channel的疑问
来源:11-1 channel

AllenChen318
2018-02-27
代码如下: package main import ( "fmt" "runtime" ) func test(c chan bool, n int) { x := 0 for i := 0; i < 100000000; i++ { x += i } fmt.Println(n, x) if n == 5 { c <- true } } func main() { runtime.GOMAXPROCS(1) c := make(chan bool) for i := 0; i < 10; i++ { go test(c, i) } <-c fmt.Println("main ok") }
执行结果如下:
9 4999999950000000
0 4999999950000000
1 4999999950000000
2 4999999950000000
3 4999999950000000
4 4999999950000000
5 4999999950000000
main ok
请分析为什么结果第一行是9 4999999950000000?当
if n == 9 {
c <- true
}时,执行结果为什么是:
9 4999999950000000
main ok ?
多个goroutine共用一个chan是否会有问题?
谢谢!
写回答
1回答
-
多个goroutine一起并发执行,我们对他们的顺序不要进行假设。即使在一定版本一定环境下有确定性。
这个例子中不论第一行是谁,或者输出多少行再退出,都可以。我们的代码也要在所有情况下运行正确。
多个goroutine共用channel是go语言强大的地方,可以去这样使用来简化开发。012018-02-27
相似问题