goroutine和chan注意细节

需要注意的:
如果你定义了一个chan1,容量为1,就直接x:=<-chan1取一次,这样没有问题
但是你如果用了循环x,ok:=<-chan1,当你第二次取的时候会直接报死锁,原因就是你没有存的操作,就阻塞无法解开就蹦了
解决死锁的两个办法
第一种:取完通道中的值,在去取就会阻塞,就必须往里面传值,那么每次存取都是一来一回,取完等存, 存完等取,这种情况是不停的存取,
第二种:存完数据后关闭存的通道,这样在取的时候取到最后没有值了也不会阻塞,并会告诉你状态
goroutine和chan的一些状况
当存的通道关闭后,取的时候没有值的话就可以通过状态看到是否取完,但是如果有两个线程在取的时候,同时取到了一个索引,第一个线程取到的值,第二个线程在去取就没有了,得到的false状态,第二个线程就直接break了
这种情况是有可能发生在最开始的,那么就导致后面的数据全是存活的一个线程在处理,所以需要对这个情况做处理
浙公网安备 33010602011771号