我对Go的sync.Map有问题。详情如下:
我创建了一个全局同步映射,类似于:
var MySyncGlobalMap = sync.Map{}在一个事件中,我用预期的结构填充了这个映射,名为map[int64]map[string]interface{}。因此,基本上,我希望填充同步映射,键作为int64,值作为结构map[string]interface{}的另一个同步映射。下面是我如何填充地图:
//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)现在将有多个线程访问这个映射并执行一些操作。内部同步映射将不断更新。在内部同步映射的键上完成处理后,该键将从该映射中删除。
一旦内部同步映射变为空,我将知道作业已经完成。
现在,由于有多个线程访问此映射,所以我收到了恐慌:
致命错误:并发读写
我仍然在想,即使在使用同步映射之后,我也面临着这个问题。
有人能指出我做错了什么吗?
发布于 2017-12-20 06:20:37
我想出了密码的问题所在。我使用sync.Map作为值类型,而不是指针。
所以,我在复制潜在的互斥体。在读/写操作时,锁位于副本上,而不是原始互斥体上。
更改映射以使用指针解决了问题。
https://stackoverflow.com/questions/47864261
复制相似问题