我每秒钟记录一次地图的长度;我不在乎我是否具有“精确的”值/竞赛条件(可以减一)。我想知道这是否会引起恐慌,并且是否必须用一些len()
括起来{1>}。
我问是因为同时读取/写入地图会引起恐慌(Go会检测到),但是我不知道读取的长度是否算作“读取”。我已经尝试过测试程序,但无法崩溃,但我希望有一个确切的答案,至少出于这个原因。
如果很重要,我对len和数组都感兴趣。 谢谢!
答案 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
$
参考文献: