На subTask
есть гонка данных.Программы инициализации задачи читают и записывают переменную subTask
без синхронизации.
Цель программы состоит в том, чтобы создать и инициализировать срез 100 Task
значений, но он создает срез с нулевым значением 100 Task
с и добавляет еще 100 инициализированных Task
с (игнорируятолько что упомянутая проблема гонки данных).
Исправьте обе эти проблемы, назначив задачи элементам слайса:
for i := 0; i < 100; i++ {
go func(i int) {
task := Task{
Id: i,
Callback: make(chan int, 1),
}
task.Callback <- i
subTask[i] = task
}(i)
}
На элементах subTask
существует гонка данных.Нет никакой гарантии, что процедуры инициализации задачи завершат запись в элементы до того, как основная программа будет охватывать эти элементы.Исправьте с помощью группы ожидания, чтобы скоординировать завершение инициализационных и основных процедур:
subTask := make([]Task, 100)
for i := 0; i < 100; i++ {
wg.Add(1)
go func(i int) {
task := Task{
Id: i,
Callback: make(chan int, 1),
}
task.Callback <- i
subTask[i] = task
wg.Done()
}(i)
}
wg.Wait()
Запустите код на игровой площадке .
детектор расы сообщает обо всех расах, упомянутых выше.
Если код в вопросе является действительным кодом, а не минимальным примером для постановки вопроса, то горутины не нужнывообще.