珠海购物网站制作,迅雷网站做爰视频,皮具网站建设策划书,制作企业宣传片的厂家目录 一、死锁
二、Golang死锁场景
2.1 重复上锁
2.2 不会减少的 WaitGroup
2.3 空select
2.4 channel 一、死锁
1.golang中死锁的触发条件#xff1a; 死锁是当 Goroutine 被阻塞而无法解除阻塞时产生的一种状态。 2.操作系统死锁#xff1a; 发生死锁时#xff0c;线…目录 一、死锁
二、Golang死锁场景
2.1 重复上锁
2.2 不会减少的 WaitGroup
2.3 空select
2.4 channel 一、死锁
1.golang中死锁的触发条件 死锁是当 Goroutine 被阻塞而无法解除阻塞时产生的一种状态。 2.操作系统死锁 发生死锁时线程永远不能完成系统资源被阻碍使用以致于阻止了其他作业开始执行。在讨论处理死锁问题的各种方法之前我们首先深入讨论一下死锁特点。 必要条件 如果在一个系统中以下四个条件同时成立那么就能引起死锁 互斥至少有一个资源必须处于非共享模式即一次只有一个线程可使用。如果另一线程申请该资源那么申请线程应等到该资源释放为止。占有并等待—个线程应占有至少一个资源并等待另一个资源而该资源为其他线程所占有。非抢占资源不能被抢占即资源只能被线程在完成任务后自愿释放。循环等待有一组等待线程 {P0P1…Pn}P0 等待的资源为 P1 占有P1 等待的资源为 P2 占有……Pn-1 等待的资源为 Pn 占有Pn 等待的资源为 P0 占有。 我们强调所有四个条件必须同时成立才会出现死锁。循环等待条件意味着占有并等待条件这样四个条件并不完全独立。 二、Golang死锁场景
2.1 重复上锁
写写冲突读写冲突读读不冲突。golang中的锁是不可重入锁对已经上了锁的写锁再次申请锁是会报死锁。上了读锁的锁再次申请写锁会报死锁而申请读锁不会报错。
案例1: 重复上写锁 package main
import(sync
)
func main(){var lock sync.Mutexlock.Lock()lock.Lock()
} 结果死锁 正常情况 func main() {var lock sync.RWMutexlock.RLock()lock.RLock()
}
//正常执行2.2 不会减少的 WaitGroup
不会减少的 WaitGroup会永久阻塞 案例1: func main() {var wg sync.WaitGroupwg.Add(1)wg.Wait()//报死锁错误
}结果 2.3 空select 案例 package mainfunc main() {select {}
}
//报死锁错误结果 2.4 channel
1.为 nil 的channel 发送、接受数据都会阻塞
2.无缓冲的channel 发送、接受数据都会阻塞。解决方案边接受边读取
3.channel 缓冲区满了的继续发送数据会阻塞。解决办法读取channel中的数据
4.当 ch 中没有数据的时候就是从空的channel中接受数据for range ch 会发生阻塞但是无法解除阻塞发生死锁。 解决当数据发送完了过后close channel 案例1: func main() {var ch chan struct{}ch - struct{}{}
}
//报死锁错误结果 案例2: func main() {ch : make(chan struct{})- ch
}
//报死锁错误结果 参考关于golang中死锁的思考与学习_Golang_脚本之家