4868
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