首页 > 后端开发 > Golang > 如何解决Go中的'致命错误:并发map读取和map写入”?

如何解决Go中的'致命错误:并发map读取和map写入”?

Patricia Arquette
发布: 2024-12-31 04:09:40
原创
429 人浏览过

How to Solve the

“Golang 致命错误:并发映射读取和映射写入”解释

Go 中的错误“致命错误:并发映射读取和映射写入”是在多个 Goroutine 时发生的尝试同时访问地图以进行读取和写入。当一个 goroutine 尝试从映射中读取数据,而另一个 goroutine 同时向其中写入数据时,就会发生这种情况。

解决方案

sync.RWMutex

使用一个sync.RWMutex来控制对地图的访问。此选项适用于单次读取和写入的场景(不是在映射上循环)。

var someMap = map[string]string{}
var someMapMutex = sync.RWMutex{}

go func() {
    someMapMutex.Lock()
    someMap["key"] = "value"
    someMapMutex.Unlock()
}()

someMapMutex.RLock()
v, ok := someMap["key"]
someMapMutex.RUnlock()
if !ok {
    fmt.Println("key missing")
    return
}
fmt.Println(v)
登录后复制

syncmap.Map

另一种方法是使用syncmap .Map{},Go 中的并发地图类型。它在内部处理竞争条件,并且通常比常规地图慢。但是,它在 for 循环场景中表现出色。

var someMap = syncmap.Map{}

go func() {
    someMap.Store("key", "value")
}()

v, ok := someMap.Load("key")
if !ok {
    fmt.Println("key missing")
    return
}
fmt.Println(v)

// Looping over keys is simplified with syncmap
someMap.Range(func(key, value interface{}) bool {
    val, ok := value.(string)
    if !ok {
        return false // Break iteration
    }
    fmt.Println(key, val)
    return true // Continue iteration
})
登录后复制

一般建议

为了防止此错误,建议使用 -race 选项测试您的服务器,以识别并消除潜在的竞争条件.

go run -race server.go
登录后复制

通过实施这些解决方案并遵循这些准则,您可以避免“并发映射读取和映射写入”错误并确保线程安全访问 Go 代码中的共享数据。

以上是如何解决Go中的'致命错误:并发map读取和map写入”?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板