新来并确保我在正确的页面上使用通道 + 并发我有一个结构type Playlist struct { playList []*Song updateList chan *Song}我有 2 个函数可以在单独的 go 例程中操作数据。第一个是每当在频道上发送指向歌曲的指针时将数据附加到播放列表: func (p *Playlist) continuousUpdate() { go func (){ for newSong := range p.updateList { p.playlist = append(p.playlist, newSong) } }() }第二个,每 24 小时一个计时器将滴答,从而将播放列表重置为一个空片段。func (p *Playlist) controlCurrentPlayList(c <-chan time.Time) { go func(){ for { <-c p.playlist = make([]*Song, 0) log.Println("Current playlist has reset") } }()}两个独立的通道是否处理数据的同步?或者我很容易遇到竞争条件?跑了go build -race,没有出现错误。
1 回答
慕田峪4524236
TA贡献1875条经验 获得超5个赞
因为该字段playlist是从两个没有同步的 goroutine 访问的,所以存在竞争。
竞态检测器在运行时检测竞态,而不是构建时。直到 24 小时重置计时器滴答作响,才会检测到这场比赛。
可以通过使用 select 语句组合两个 goroutine 来消除竞争:
for {
select {
case newSong := <-p.updateList:
p.playlist = append(p.playlist, newSong)
case <-c:
p.playlist = make([]*Song, 0)
log.Println("Current playlist has reset")
}
}
- 1 回答
- 0 关注
- 171 浏览
添加回答
举报
0/150
提交
取消