博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于channel的一些坑
阅读量:6262 次
发布时间:2019-06-22

本文共 735 字,大约阅读时间需要 2 分钟。

channel可以分为无缓冲和带缓冲的通道

无缓冲的,必须要一个协程发送,一个协程接收

package mainfunc main() {	var ch = make(chan int)	ch <- 1	<- ch}

在主协程main,执行到 ch <- 1,即发送完消息就阻塞了。

下一句 <- ch 永远无法执行,因为所有goroutines都睡着了(即没有协程接收) - 死锁!!!

 

假如是带缓冲的,如下

package mainfunc main() {	var ch = make(chan int, 1)	ch <- 1	<- ch}  

则不会报错,因为main goroutine并没有被阻塞,带缓冲1

 

如果连续发两个,则会报错,如下:

package mainfunc main() {	var ch = make(chan int, 1)	ch <- 1	ch <- 1	<- ch}

 

但如果你及时接收了,则又不会报错,如下:

package mainfunc main() {	var ch = make(chan int, 1)	ch <- 1	<- ch	ch <- 1	<- ch}

 

又或者在main goroutine里面再起一个goroutine,如下:

package mainfunc say(ch chan int) {	ch <- 1}func main() {	ch := make(chan int)	go say(ch)    // 新起协程,main goroutine并没有被阻塞	<- ch}

  

 

  

 

转载于:https://www.cnblogs.com/huangliang-hb/p/9759592.html

你可能感兴趣的文章
Eclipse 反编译插件JadClipse安装
查看>>
JS判断数字字母中文
查看>>
说说设计模式~观察者模式(Observer)
查看>>
[Android Memory] Android 的 StrictMode
查看>>
UBIFS 文件系统分析1 - 磁盘结构【转】
查看>>
使用命名管道实现进程间通信
查看>>
关于linux系统如何实现fork的研究(二)【转】
查看>>
PHP判断图片格式的7种方法
查看>>
selenium的那些事--命令行启动selenium并运行测试(转)
查看>>
在虚拟机里安装windows或Linux系统时,安装窗口过大按钮有时点不到解决办法(图文详解)...
查看>>
js网页进度条等待特效
查看>>
波形捕捉:(8)使用“捕捉缓冲区”
查看>>
Android开发人员的薪资调查
查看>>
生成一个空白BMP的简单代码【转】
查看>>
myeclipse汉化及其相关配置设置(转)
查看>>
Unity-WIKI 之 AnimationToPNG
查看>>
Android -- ViewDragHelper
查看>>
顺序查找 && 折半查找
查看>>
OpenCV函数学习之cvLUT
查看>>
PL/pgSQL的 RETURN NEXT例子
查看>>