4751

golang对map未带锁的读写,并发情况下导致致命错误

乐果   发表于   2017 年 08 月 28 日 标签:golang

对于智能硬件云端服务,用golang来写服务端非常适合。

公司因系统对接智能灯控,本人写了一个服务,经过几个月的生产环境验证已稳定运行了很久, 但上周末,服务突然挂了。查看日志,锁定一段致命错误提示:concurrent map iteration and map write

如下截图:

代码片段:

var (
    ModConnPool  map[string]*ConnSocket
    logsHander   []func(s string)
    keepAliveCmd []byte
    regCodeSlice []string
)

func init() {
    ModConnPool = make(map[string]*ConnSocket)
    logsHander = make([]func(s string), 0)
    logsHander = append(logsHander, func(s string) {
        fmt.Println(s)
    })
    keepAliveCmd, _ := hex.DecodeString("fe55040092")
    keepAliveCmd = getCRC(keepAliveCmd)
    go _keepAlive()
}

func _keepAlive() {
    for {
        for _, conn := range ModConnPool { //此处引发的报错。。。
            conn.CheckkeepAlive()
        }
        time.Sleep(3000 * time.Millisecond)
    }
}

显然,这个对“链接池”map中的链接,每隔3秒进行“模拟心跳”,range“链接池”map时,并未带锁,此时,如果有write操作,则程序就会报concurrent map iteration and map write 了。

乐果   发表于   2017 年 08 月 28 日 标签:golang

0

文章评论