关于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回答

ccmouse

2018-02-27

多个goroutine一起并发执行,我们对他们的顺序不要进行假设。即使在一定版本一定环境下有确定性。
这个例子中不论第一行是谁,或者输出多少行再退出,都可以。我们的代码也要在所有情况下运行正确。
多个goroutine共用channel是go语言强大的地方,可以去这样使用来简化开发。

0
1
AllenChen318
非常感谢!
2018-02-27
共1条回复

Google资深工程师深度讲解Go语言 由浅入深掌握Go语言

语法+分布式爬虫实战 为转型工程师量身打造

5995 学习 · 1909 问题

查看课程