После запуска писателя возникает data race, и runtime может аварийно завершить процесс с concurrent map read and map write. Гарантированной последовательности единиц и двоек нет.
Конкурентный доступ к глобальной карте из горутин
После запуска писателя возникает data race, и runtime может аварийно завершить процесс с concurrent map read and map write. Гарантированной последовательности единиц и двоек нет.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
В программе объявлена глобальная карта типа map[string]int, к которой одновременно обращаются несколько горутин – одна только читает, другая только пишет. Какой результат будет при запуске следующего кода?
package main
import (
"fmt"
"time"
)
var dataMap = map[string]int{"a": 1}
func main() {
go reader()
time.Sleep(1 * time.Second)
go writer()
time.Sleep(1 * time.Second)
}
func reader() {
for {
fmt.Println(dataMap["a"])
}
}
func writer() {
for {
dataMap["a"] = 2
}
}
Ответ
После запуска писателя возникает data race, и runtime может аварийно завершить процесс с concurrent map read and map write. Гарантированной последовательности единиц и двоек нет.
Первый Sleep лишь откладывает запуск writer, второй не синхронизирует доступ к map. Защитите все чтения и записи одной блокировкой либо измените модель владения. Добавьте отмену бесконечных циклов и ожидание завершения вместо Sleep. Фатальная проверка runtime — возможное проявление гонки, а не гарантия её обнаружения в каждом запуске.