goroutine和chan注意细节

 

 

 

 需要注意的:

如果你定义了一个chan1,容量为1,就直接x:=<-chan1取一次,这样没有问题

但是你如果用了循环x,ok:=<-chan1,当你第二次取的时候会直接报死锁,原因就是你没有存的操作,就阻塞无法解开就蹦了

解决死锁的两个办法

第一种:取完通道中的值,在去取就会阻塞,就必须往里面传值,那么每次存取都是一来一回,取完等存, 存完等取,这种情况是不停的存取,

第二种:存完数据后关闭存的通道,这样在取的时候取到最后没有值了也不会阻塞,并会告诉你状态

goroutine和chan的一些状况

当存的通道关闭后,取的时候没有值的话就可以通过状态看到是否取完,但是如果有两个线程在取的时候,同时取到了一个索引,第一个线程取到的值,第二个线程在去取就没有了,得到的false状态,第二个线程就直接break了

这种情况是有可能发生在最开始的,那么就导致后面的数据全是存活的一个线程在处理,所以需要对这个情况做处理

 

posted @ 2022-03-10 00:18  咖喱给给啊  阅读(87)  评论(0)    收藏  举报