第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

Golang/Gopher 如何操作不同通道中的數(shù)據(jù)?

Golang/Gopher 如何操作不同通道中的數(shù)據(jù)?

Go
浮云間 2021-11-01 14:15:53
新來并確保我在正確的頁面上使用通道 + 并發(fā)我有一個(gè)結(jié)構(gòu)type Playlist struct {  playList   []*Song  updateList chan *Song}我有 2 個(gè)函數(shù)可以在單獨(dú)的 go 例程中操作數(shù)據(jù)。第一個(gè)是每當(dāng)在頻道上發(fā)送指向歌曲的指針時(shí)將數(shù)據(jù)附加到播放列表:  func (p *Playlist) continuousUpdate() {    go func (){      for newSong := range p.updateList {        p.playlist = append(p.playlist, newSong)      }    }()  }第二個(gè),每 24 小時(shí)一個(gè)計(jì)時(shí)器將滴答,從而將播放列表重置為一個(gè)空片段。func (p *Playlist) controlCurrentPlayList(c <-chan time.Time) {  go func(){    for {      <-c      p.playlist = make([]*Song, 0)      log.Println("Current playlist has reset")    }  }()}兩個(gè)獨(dú)立的通道是否處理數(shù)據(jù)的同步?或者我很容易遇到競(jìng)爭(zhēng)條件?跑了go build -race,沒有出現(xiàn)錯(cuò)誤。
查看完整描述

1 回答

?
慕田峪4524236

TA貢獻(xiàn)1875條經(jīng)驗(yàn) 獲得超5個(gè)贊

因?yàn)樵撟侄蝡laylist是從兩個(gè)沒有同步的 goroutine 訪問的,所以存在競(jìng)爭(zhēng)。


競(jìng)態(tài)檢測(cè)器在運(yùn)行時(shí)檢測(cè)競(jìng)態(tài),而不是構(gòu)建時(shí)。直到 24 小時(shí)重置計(jì)時(shí)器滴答作響,才會(huì)檢測(cè)到這場(chǎng)比賽。


可以通過使用 select 語句組合兩個(gè) goroutine 來消除競(jìng)爭(zhēng):


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")

    }

 }


查看完整回答
反對(duì) 回復(fù) 2021-11-01
  • 1 回答
  • 0 關(guān)注
  • 207 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)