dreamy1992
2018-10-08 22:25
浏览 237
已采纳

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

I'm logging every second the length of a map; I don't care if I have the "exact" value / race conditions (off by one is ok). I'm interested to know if this could cause a panic and if I have to enclose len() with some .RLock()/Unlock() or not.

I'm asking because concurrent reads/writes in a map will cause a panic (Go detects that) but I don't know if reading the length counts as a "read". I have tried with a test program but cannot produce a crash but I'd rather have an exact answer, at least for the sake of it.

If it matters I'm interested in both len for arrays and for maps. Thanks!

图片转代码服务由CSDN问答提供 功能建议

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

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

如果这很重要,我对两者都感兴趣 len表示数组和地图。 谢谢!

  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

1条回答 默认 最新

  • duanlv4984 2018-10-08 22:44
    已采纳

    It is a race condition. The results are undefined. For example,

    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
        }
    }
    

    Output:

    $ 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
    $
    

    References:

    Wikipedia: Race condition

    The Go Blog: Introducing the Go Race Detector

    Go: Data Race Detector

    Benign Data Races: What Could Possibly Go Wrong?

    已采纳该答案
    打赏 评论

相关推荐 更多相似问题