len()线程在golang中安全吗?

时间:2018-10-08 22:25:53

标签: go

我每秒钟记录一次地图的长度;我不在乎我是否具有“精确的”值/竞赛条件(可以减一)。我想知道这是否会引起恐慌,并且是否必须用一些len()括起来{}。

我问是因为同时读取/写入地图会引起恐慌(Go会检测到),但是我不知道读取的长度是否算作“读取”。我已经尝试过测试程序,但无法崩溃,但我希望有一个确切的答案,至少出于这个原因。

如果很重要,我对len和数组都感兴趣。 谢谢!

1 个答案:

答案 0 :(得分:1)

这是比赛条件。结果是不确定的。例如,

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
$

参考文献:

Wikipedia: Race condition

The Go Blog: Introducing the Go Race Detector

Go: Data Race Detector

Benign Data Races: What Could Possibly Go Wrong?