Поиск гонки с -race

К задачам
Средняя
Concurrency

Условие задачи

Напиши минимальный пример, в котором возникает гонка данных при доступе к общей переменной из нескольких горутин. Запусти программу с флагом `-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)
}