新來并確保我在正確的頁面上使用通道 + 并發(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")
}
}
- 1 回答
- 0 關(guān)注
- 207 瀏覽
添加回答
舉報(bào)
0/150
提交
取消