golang
golang copied to clipboard
条件变量例子中的条件判断问题
examples/module2/condition/main.go 中的队列 Dequeue 方法中,使用 if 进行条件检查:
func (q *Queue) Dequeue() string {
q.cond.L.Lock()
defer q.cond.L.Unlock()
if len(q.queue) == 0 {
fmt.Println("no data available, wait")
q.cond.Wait()
}
...
建议改成使用 for 循环判断,避免多线程的情况下 Wait() 返回时条件已经变化:
for len(q.queue) == 0 {
fmt.Println("no data available, wait")
q.cond.Wait()
}
例子中执行 Dequeue 的 goroutine 只有一个因此没有影响,本地试了下改成3个 goroutine 时就会出问题:
❯ go run main.go
no data available, wait
putting a to queue, notify all
no data available, wait
no data available, wait
no data available, wait
putting a to queue, notify all
panic: runtime error: index out of range [0] with length 0
goroutine 20 [running]:
main.(*Queue).Dequeue(0xc0000ba000)
/home/jarvis/go/src/github.com/cncamp/golang/examples/module2/condition/main.go:52 +0x170
main.main.func2()
/home/jarvis/go/src/github.com/cncamp/golang/examples/module2/condition/main.go:29 +0x25
created by main.main
/home/jarvis/go/src/github.com/cncamp/golang/examples/module2/condition/main.go:27 +0x105
exit status 2
赞,小程序只为了做个demo演示一下能力,你能发个PR吗?
好的