“通道写完后,必须关闭通道,否则range遍历会出现死锁”这句话对吗?

通道写完后,必须关闭通道,否则range遍历会出现死锁,请问这句话对吗?

那么如果我有一个场景,一个goroutine往通道写数据,一个或多个goroutine从通道读数据,这种情况是没有关闭通道的,那应该怎么写?


补充:

我提的问题有点没说清楚,这个往通道写是个死循环的不断写的过程,读也是不断的读,所以你怎么关闭通道?目前我是开一个goroutine不断写,开5个goroutine用range读,尚没有问题,但是看书有这么一句所以问问。

https://img1.mukewang.com/5c79e06e000155c608000329.jpg

这个通道是不断写数据的,所以不存在“通道写完后”,所以也无法关闭,那么另外的goroutine就只管range读取数据就好了可以吗?,问题改成这个,理解对吗,目前程序运行没有报错,只是请教一下这样写是否规范。


森栏
浏览 1166回答 2
2回答

qq_笑_17

通道写完后,必须关闭通道,否则range遍历会出现死锁,请问这句话对吗?没错, 关闭 channel 会导致 for range 退出循环.但, 用简单关闭 channel 的方式控制读写 routine 是危险的, 因为写入已经关闭的 channel 会直接崩溃.所以你得给 channel 加个状态值, 防止这种情况发生. 当然了, 你也可以不用 channel, 自己用锁实现.下面举两个例子, 分别是利用 channel 和不用 channel 实现的 生产/消费 模型.注意: 例子只提供思路, 并不完善.
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript