谁能帮忙解释一段并发代码的诡异结果

star24 · · 3509 次点击
正常情况下之所以能够安全退出,是因为当<-ch都能够释放时,如果此时cpu使用率还不是很高,(能够继续运行主程序记下来的运算),主程序结束,导致整个程序结束,系统资源释放,死循环也就会结束了,所以对系统没有影响.但是这种情况下,你在主程序最后加上time.Sleep(1*time.Second),让主程序不要立即结束,而是给其他goroutine中死循环一定的运行时间,你变会发现每次程序都会挂掉,cpu运行都会达到100% 2)在运行过程中,你指定了程序运行的核数,则整个程序便会在这些核中自己进行调度分配,当一个核由于goroutine阻塞,则该核上的其他goroutine便会迁移到其他核运行(这是由系统自动实现的).3)程序陷入死循环后,只是指定运行核的cpu达到100%,如果你并不是指定所有的核作为程序运行核,你便会发现其他核的cpu使用率并不高.
#8
更多评论
问题应该是你的死循环问题上面.运行死循环占用大量cpu资源,这时候其他任务就不能正常执行,因此会出现程序"死亡"状态.该程序删掉j的死循环便可正常执行.
#1
有结果输出也是有可能的,ch <- subSum 是在死循环前,主goroutine是可以到,幸运的话还是输出结果的;要是有一个或者多个gorountine跑到了死循环, 这种空转cpu肯定回100%,还会导致其他goroutine没法执行
#2