1 回答
TA贡献1895条经验 获得超7个赞
代码有很多问题,让我们看看。
您的
pop
函数在访问切片时不会锁定,因此这就是数据竞争。for len(list) > 0 {}
是数据竞争,因为您正在访问列表,同时在其他 2 个 goroutine 中修改它。for len(list) > 0 {}
永远不会返回,因为您的列表中有 3 个项目,但您只调用了两次 pop。receiver(c)
由于 #3 导致的错误,它尝试从通道读取但没有写入任何内容。
一种方法是使用一个写入器 ( pop
) 和多个读取器 ( receiver
):
func pop(list *[]int, c chan int, done chan bool) {
for len(*list) != 0 {
result := (*list)[0]
*list = (*list)[1:]
fmt.Println("about to send ", result)
c <- result
}
close(c)
done <- true
}
func receiver(c chan int) {
for result := range c {
fmt.Println("received ", result)
}
}
var list = []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
func main() {
c := make(chan int)
done := make(chan bool)
go pop(&list, c, done)
go receiver(c)
go receiver(c)
go receiver(c)
<-done
fmt.Println("done")
}
go run -race blah.go
在弄乱 goroutine 时总是使用。
- 1 回答
- 0 关注
- 185 浏览
添加回答
举报