goroutine,信道(channel),死锁

goroutine,信道(channel),死锁的一些重点总结

信道(channel)是goroutine之间互相通讯的东西,就是在做goroutine之间的内存共享,默认的信道的存消息和取消息都是阻塞的,这就叫做无缓冲的信道,也就是说,无缓冲的信道在取消息和存消息的时候都会挂起当前的goroutine,除非另一端已经准备好。

var ch chan int = make(chan int)
func foo(){
	ch <- 0 //向ch中加数据,如果没有其他goroutine来取走这个数据,那么挂起foo,直到main函数把0这个数据取走
}
func main(){
	go foo()
	<- ch //从ch取数据,如果ch中还没有放数据,那就挂起main,直到foo函数中放数据为止
}
註:主goroutine执行结束,程序结束,其他的goroutine停止执行

无缓冲的信道永远不会存储数据,只负责数据的流通,从无缓冲信道取数据,必须要有数据流进来才可以,否则当前协程阻塞,数据流入无缓冲信道,如果没有其他goroutine来拿走这个数据,那么当前协程阻塞,无缓冲信道的大小都是0 (len(channel))

如果信道正有数据在流动,还要加入数据,或者信道干涩,我们一直向无数据流入的空信道取数据,就会引起死锁。

死锁的例子

func main(){
	ch := make(chan int)
	<- ch //阻塞main goroutine,信道被锁 ,报错fatal error: all goroutines are asleep - deadlock!
}
ch := make(chan int,1)//只能缓存1个,在写入第一个数据不会阻塞,没有取走第一个数据时,再写入第二个时就会阻塞
被关闭的信道会禁止数据流入,是只读的,我们仍然可以从关闭的信道中取数据,但是不能在写入数据了,在使用range遍历读取信道数据时应注意。

无缓冲的信道是一批数据一个一个的流进流出,缓冲信道则是一个一个存储然后一起流出

社区名言:不要通过共享内存来通讯,而应该通过通信来共享内存

参考:http://blog.csdn.net/sb___itfk/article/details/79045906

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值