新的去确保我在右侧页面上有通道+并发我有一个结构
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
并且没有出现错误。
答案 0 :(得分:5)
因为从两个没有同步的goroutine访问字段playlist
,所以存在竞争。
比赛检测器在运行时检测比赛,而不是构建时间。在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")
}
}