关于goroutine的问题,求质数的案例

SamuelSue · · 1212 次点击 · 开始浏览    置顶
这是一个创建于 的主题,其中的信息可能已经有所发展或是发生改变。

```go func PrimeNum(start, end int, resChan chan int, exitChan chan bool) { var i, j int var flag bool for i = start; i < end; i++ { if i == 0 || i == 1 { continue } flag = true k := int(math.Sqrt(float64(i))) for j = 2; j <= k; j++ { if i%j == 0 { flag = false break } } if flag { resChan <- i } } exitChan <- true } func main() { res := make([]int, 0) // 存储质数的切片 end := 100000 // 100000范围内的质数 step := 20000 // 分配每个goroutine20000个数来求质数 times := end / step routineCount := times // 需要多少个gouroutine if end%step != 0 { routineCount++ } var resChan = make(chan int, 50) // 临时存储质数的chan var exitChan = make(chan bool, routineCount) // 记录goroutine退出 var i int for i = 0; i < times; i++ { go PrimeNum(i*step, (i+1)*step, resChan, exitChan) } if routineCount > times { go PrimeNum(i*step, end+1, resChan, exitChan) } // 为什么不能直接for而需要一个goroutine? go func() { for i = 0; i < routineCount; i++ { <-exitChan } close(resChan) // 关闭resChan }() for { v, ok := <-resChan if !ok { break } res = append(res, v) // 写入切片 } fmt.Println(len(res)) } ``` 在`main()`里面取`exitChan`的时候为什么需要一个go func? 我试过去掉那个go func,程序会deadlock,为什么?exitChan是有写入和取出的。还是说在main主线程中直接取exitChan时因为没有数据而造成主线程阻塞从而引发panic?求大佬们解答一下,小弟感激不尽。

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

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

1212 次点击  
加入收藏 微博
4 回复  |  直到 2019-09-04 10:20:19
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传