关于Sync.Mutex的竞争问题

Chaoxin · · 1214 次点击
个人理解,你在对通道元素的发送、接收外部封装了锁,确实保证了同一时间要么在向通道写元素,要么在从通道里面读元素,但是由于发送/接收操作都在go routine中实现,因此两种情况会出现死锁: * 接收操作先获取到锁:此时由于通道中没有元素,接收的routine会一直阻塞,且由于锁的原因,发送routine始终无法竞争到锁,更别提向通道发送元素 * 发送routine连续5次竞争到锁或者接收routine连续5次竞争到锁的情况:由于通道容量只有5,连续接收5个或者连续发送5个元素后均无法再继续操作,此时也会阻塞
#14
更多评论
个人理解不一定正确: produce在执行第五次的时候,ch已经执行mu.Lock(),此时ch已满,通道阻塞,但是mu.Unlocl没有释放锁,所以造成了持续阻塞。
#1
谢谢解答。不过我的疑惑是produce在通道未满的时候,也有释放锁。但是consumer永远竞争不到,produce一直占有
#2