求解,go语言线程

zhongguohaomao001 2018-09-16 12:50:39
测试了一下go的channel,不close的时候,感觉应该不会报错,但是运行提示死锁了,为什么,求解?换成有缓冲的channel也是报死锁的错误!!!!!!!
package main

import (
"fmt"
)

func main() {
channel:= make(chan int)

go func() {
for i := 0; i < 5; i++ {
ch <- i
fmt.Println(i)
}
//close(channel)
}()

for {
if num, ok := <-channel; ok == true {
fmt.Println("num=", num)
} else {
break
}
}
}

...全文
904 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2019-12-20
  • 打赏
  • 举报
回复
ok去掉,也不要else
瑞卡哥哥 2019-10-21
  • 打赏
  • 举报
回复
我只看到了 ch未定义
林震南 2019-06-04
  • 打赏
  • 举报
回复
问题已经解决了吗啊
ying1234 2018-12-11
  • 打赏
  • 举报
回复
楼主主要是不知道num, ok := <-channel; 这个ok指的是chan是否关闭,你//close(channel)这句注释掉了,那么num, ok := <-channel的ok永远是true,而这语句又在死循环内,不报死锁才怪。
qybao 2018-12-06
  • 打赏
  • 举报
回复
chanel不close,num, ok := <-channel;接收5次数据后就一直阻塞,而阻塞又在循环里,造成死锁
  • 打赏
  • 举报
回复
协程 不是异步的 你写一条需要有对应的读,所有你这样写会发生阻塞的问题,你应该 给channel:= make(chan int) 价格缓存区 类似这样:channel:= make(chan int,1024) 这个时候他的存储为1M 只要没有达到1M就会一直写 哪怕没有读也是一样 直到达到1M后阻塞 希望可以帮到你
laokz 2018-10-17
  • 打赏
  • 举报
回复
ok为false
laokz 2018-10-17
  • 打赏
  • 举报
回复
num,ok:=<-channel 当channel未close时 ,如channel内有数据则num有值、ok为true;无数据时阻塞。 当channel已close时,如channel有数据则同上,无数据时num为零值、ok为false
「已注销」 2018-09-18
  • 打赏
  • 举报
回复
没有实际调试你这段代码。分析之后认为,你这个channel是在其他五个goroutine 里面往其中写入数据,但是写入次数是有限的,但你却在主goroutine 里面写了一个无限循环。当其他goroutine推出之后,你的main 函数会因为读channel永远阻塞。

2,348

社区成员

发帖
与我相关
我的任务
社区描述
go语言学习与交流版
社区管理员
  • go语言社区
  • 俺叫西西弗斯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧