1 回答
TA貢獻1816條經驗 獲得超4個贊
WaitGroup實現基于內部計數器,該計數器由 和 方法更改。在計數器歸零之前,該方法不會返回。也可以重復使用,但在文檔中描述的某些條件下:AddDoneWaitWaitGroup
// If a WaitGroup is reused to wait for several independent sets of events,
// new Add calls must happen after all previous Wait calls have returned.
盡管您的代碼沒有重用,但它能夠多次將計數器清零。當在給定時間沒有處理任何任務時,就會發生這種情況,這在并發代碼中是完全可能的。由于您的代碼在調用之前不會等待返回,因此您會收到爭用條件錯誤。wgWaitGroupWaitAdd
正如每個人在評論中建議的那樣,您應該放棄跟蹤任務的想法,轉而控制正在運行的戈魯丁。附加代碼建議。WaitGroup
func Test(t *testing.T) {
var wg sync.WaitGroup
queuedTaskC := make(chan func(), 10)
for i := 0; i < 5; i++ {
wID := i + 1
wg.Add(1)
go func(workerID int) {
defer wg.Done()
for task := range queuedTaskC {
task()
}
}(wID)
}
for i := 0; i < 10; i++ {
queuedTaskC <- func() {
fmt.Println("executing task...")
}
}
close(queuedTaskC)
wg.Wait()
fmt.Println(len(queuedTaskC))
}
- 1 回答
- 0 關注
- 106 瀏覽
添加回答
舉報
