请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

关于channel的疑问

代码如下:
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语言强大的地方,可以去这样使用来简化开发。

0 回复 有任何疑惑可以回复我~
  • 提问者 AllenChen318 #1
    非常感谢!
    回复 有任何疑惑可以回复我~ 2018-02-27 16:37:41
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信