【问题标题】:fatal error: concurrent map read and map write致命错误:并发映射读取和映射写入
【发布时间】:2018-03-26 06:13:42
【问题描述】:
fatal error: concurrent map read and map write

goroutine 5065809 [running]:
runtime.throw(0x6b4281, 0x21)
        /usr/local/go/src/runtime/panic.go:566 +0x95 fp=0xc420c05670 
sp=0xc420c05650
runtime.mapaccess1_faststr(0x65ea20, 0xc420015020, 0xc42178ea8e, 0x16, 
0x0)
        /usr/local/go/src/runtime/hashmap_fast.go:201 +0x4f3 
fp=0xc420c056d0 sp=0xc420c05670
collider.(*Collider).httpHandler(0xc420013120, 0x7c4dc0, 0xc4209dcdd0, 
0xc420a954a0)
        /home/ec2-user/goWorkspace/src/collider/collider.go:176 +0x7dd 
fp=0xc420c05c48 sp=0xc420c056d0

代码是

    query := r.URL.Query()
    if(query["q"] == nil){
        c.httpError("must have a question",w)
        return
    }
    m := query["q"][0]       //this is line 176

它大约每天发生一次,并且在它发生之后整个 http 服务器都关闭了。我不知道 http get 是否在 map 中做一些并发写入。 如何解决?

【问题讨论】:

  • 找到并发写入并摆脱数据竞争。
  • 错误信息不完整。它还包含映射写入的跟踪。您需要同步这两个函数。

标签: go


【解决方案1】:

您可能正在为地图使用全局变量。每个请求都可以访问全局变量。运气不好,两个请求尝试同时访问同一个地图,因此您的错误。

最简单的解决方法是使用包sync 中的Map。但根据您的用例,这可能更像是一种解决方法。但这会减慢您的程序。

如果您只需要它,另一种方法是在处理程序中定义地图。

如果您可以发布更多文件,则更容易给出更好的答案。

【讨论】:

    猜你喜欢
    • 2019-10-31
    • 1970-01-01
    • 2017-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多