我在使用 Go 的 sync.Map
时遇到问题。以下是详细信息:
我创建了一个全局同步 map ,如下所示:
var MySyncGlobalMap = sync.Map{}
在一个事件中,我用预期的结构填充这张 map
map[int64]map[string]接口(interface){}
。所以基本上我想填充 sync map 键作为 int64
和值作为结构 map[string]interface 的另一个sync map {}
。以下是我填充 map 的方式:
//below is the innerSync map. recSet is returned from DB call in the format : []map[string]interface{}
var innerSyncMap = sync.Map{}
for _, record := range recSet {
sKey := record["key"].(string)
value := record["value"]
innerSyncMap.Store(sKey, value)
}
MySyncGlobalMap.Store(jobID, innerSyncMap)
现在将有多个线程访问此 map 并执行一些操作。内部同步 map 将不断更新。对内部同步映射的键进行处理后,该键将从该映射中删除。
一旦内部同步映射变空,我就会知道作业已完成。
现在因为有多个线程访问这个 map ,我收到一个 panic :
Fatal error: concurrent read and write
我仍然想知道,即使在使用了sync map 之后,我仍然面临这个问题。
谁能指出我做错了什么?
最佳答案
我弄清楚了代码的问题所在。我使用 sync.Map 作为值类型而不是指针。
所以,我正在制作底层互斥量的副本。在读/写操作中,锁在副本上而不是原始互斥锁上。
将 map 更改为使用指针解决了问题。
关于go - 面对 Go 同步映射的并发问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47864261/