Вы не использовали пакет atomic
в всех местах, где вы получили доступ к переменной. Весь доступ должен быть синхронизирован с переменными, к которым обращаются из нескольких групп одновременно, включая reads :
for {
if value := atomic.LoadInt64(&a); value < 100 {
atomic.AddInt64(&a, 1)
go run()
}
}
С этим изменением состояние гонки исчезает.
Если вы просто хотите проверить значение, вам даже не нужно сохранять его в переменной, так что вы можете просто сделать:
for {
if atomic.LoadInt64(&a) < 100 {
atomic.AddInt64(&a, 1)
go run()
}
}