Является ли len () поток безопасным в Голанге? - PullRequest
0 голосов
/ 09 октября 2018

Я записываю каждую секунду длину карты;Мне все равно, если у меня есть "точное" значение / условия гонки (от одного в порядке).Мне интересно знать, может ли это вызвать панику, и если у меня есть для включения len() с некоторыми .RLock()/Unlock() или нет.

Я спрашиваю, потому что одновременныйчтение / запись на карте вызовет панику (Го обнаруживает это), но я не знаю, считается ли чтение длины «чтением».Я пробовал с тестовой программой, но не могу произвести сбой, но я бы предпочел точный ответ, по крайней мере, ради этого.

Если это имеет значение, меня интересуют как len для массивов, так и длякарты.Спасибо!

1 Ответ

0 голосов
/ 09 октября 2018

Это состояние гонки.Результаты не определены.Например,

racer.go:

package main

func main() {
    m := make(map[int]int)
    l := 0
    go func() {
        for {
            l = len(m)
        }
    }()
    for i := 0; i < 10000; i++ {
        m[i] = i
    }
}

Вывод:

$ go run -race racer.go
==================
WARNING: DATA RACE
Read at 0x00c00008e000 by goroutine 5:
  main.main.func1()
      /home/peter/gopath/src/racer.go:8 +0x5f

Previous write at 0x00c00008e000 by main goroutine:
  runtime.mapassign_fast64()
      /home/peter/go/src/runtime/map_fast64.go:92 +0x0
  main.main()
      /home/peter/gopath/src/racer.go:12 +0xba

Goroutine 5 (running) created at:
  main.main()
      /home/peter/gopath/src/racer.go:6 +0x92
==================
Found 1 data race(s)
exit status 66
$

Ссылки:

Википедия: Гонкаусловие

Блог Go: знакомство с Go Race Detector

Go: Data Race Detector

Доброкачественные гонки данных: что может пойти не так?

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