Поиск гонки с -race
Условие задачи
Напиши минимальный пример, в котором возникает гонка данных при доступе к общей переменной из нескольких горутин. Запусти программу с флагом `-race` и убедись, что гонка обнаружена.
package main
import (
"fmt"
)
var x int
func main() {
go func() {
x = 1
}()
go func() {
fmt.Println(x)
}()
}
package main
import (
"fmt"
)
var x int
func main() {
go func() {
x = 1
}()
go func() {
fmt.Println(x)
}()
}
Подсказка
- Запусти программу с флагом: go run -race main.go - Попробуй многократно запустить — гонка может проявляться не всегда.
Решение
В данном примере две горутины читают и записывают переменную одновременно без синхронизации.
package main
import (
"fmt"
"time"
)
var x int
func main() {
go func() {
x = 1
}()
go func() {
fmt.Println(x)
}()
time.Sleep(100 * time.Millisecond)
}
package main
import (
"fmt"
"time"
)
var x int
func main() {
go func() {
x = 1
}()
go func() {
fmt.Println(x)
}()
time.Sleep(100 * time.Millisecond)
}