Golang/Gopher 如何操作不同通道中的数据?

新来并确保我在正确的页面上使用通道 + 并发我有一个结构


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,没有出现错误。


浮云间
浏览 172回答 1
1回答

慕田峪4524236

因为该字段playlist是从两个没有同步的 goroutine 访问的,所以存在竞争。竞态检测器在运行时检测竞态,而不是构建时。直到 24 小时重置计时器滴答作响,才会检测到这场比赛。可以通过使用 select 语句组合两个 goroutine 来消除竞争:for {&nbsp; &nbsp; select {&nbsp; &nbsp; case newSong := <-p.updateList:&nbsp; &nbsp; &nbsp; &nbsp; p.playlist = append(p.playlist, newSong)&nbsp; &nbsp; case <-c:&nbsp; &nbsp; &nbsp; &nbsp; p.playlist = make([]*Song, 0)&nbsp; &nbsp; &nbsp; &nbsp; log.Println("Current playlist has reset")&nbsp; &nbsp; }&nbsp;}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go