解决死锁
来源:16-3 并发调度器

拧壶冲
2020-09-28
本节讲到简单方式解决死锁,用channel发送 request到 workchan里面,也提到和waitgroup里面一样的方式。
func (scheduler *SimpleScheduler) Submit(r engine.Request) {
go func() {
scheduler.workerChan <- r
}()
}
但是我记得waitgroup就是可以用来解决这个问题呢,为什么不用waitgroup来调度呢?每次发了request到workerchan里面,就done一次。总数10个waitgroup也可以
func (scheduler *SimpleScheduler) Submit(r engine.Request,wg *sync.WaitGroup) {
w := worker {
request: r
done: func() {
wg.done
}
}
go func(worker) {
scheduler.workerChan <- worker.request
worker.done()
}(w)
}
写回答
1回答
-
ccmouse
2020-09-28
这里我的表述有些歧义,意思是像waitgroup那个例子里用到的方式一样。waitgroup那个例子里,也使用了go开启一个goroutine,来避免这种收发都在一个goroutine导致死锁。具体在:https://git.imooc.com/coding-180/coding-180/src/master/lang/channel/done/done.go#L30
而waitgroup本身并不能用来避免死锁,它只是用来等待任务完成。你后面的采用waitgroup的Submit里,还是使用了go func的形式来避免这种收发都是同一个goroutine导致的死锁问题。而waitgroup也是有用的,它可以让你知道什么时候发送完成。
不过这里在go func(worker)之前应该要加上:
wg.Add(1)
00
相似问题