Присвоить карту другой карте - это безопасность на Голанге? - PullRequest
0 голосов
/ 06 мая 2019

код типа:

    m := make(map[interface{}]interface{})
    //read
    for i := 0; i< 10000; i++ {
        go func() {
            for range m {

            }
        }()
    }
    //write
    for i := 0; i< 10000; i++ {
        go func() {
            mTemp := make(map[interface{}]interface{})
            m = mTemp
        }()
    }

Доступно 10000 процедур чтения м, а еще 10000 операций записи назначают новую карту для m, и это безопасно?

1 Ответ

4 голосов
/ 06 мая 2019

У вас есть программы, читающие переменную m, и программы, записывающие переменную m без явной синхронизации.Это гонка данных и, следовательно, неопределенное поведение.

Запустите его с включенным детектором гонки:

$ go run -race play.go
==================
WARNING: DATA RACE
Write at 0x00c00008c000 by goroutine 15:
  main.main.func2()
      /home/icza/gows/src/play/play.go:17 +0x46

Previous read at 0x00c00008c000 by goroutine 5:
  main.main.func1()
      /home/icza/gows/src/play/play.go:8 +0x45

Goroutine 15 (running) created at:
  main.main()
      /home/icza/gows/src/play/play.go:15 +0xdd

Goroutine 5 (finished) created at:
  main.main()
      /home/icza/gows/src/play/play.go:7 +0xa4
==================
Found 1 data race(s)
exit status 66

См. Связанные вопросы:

Безопасно личитать указатель функции одновременно без блокировки?

Также пример, который нарушает безопасность памяти Go с преднамеренной гонкой данных: Гонки данных Golang нарушают безопасность памяти

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...