首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >面对Go同步映射的并发问题

面对Go同步映射的并发问题
EN

Stack Overflow用户
提问于 2017-12-18 08:04:23
回答 1查看 1.5K关注 0票数 0

我对Go的sync.Map有问题。详情如下:

我创建了一个全局同步映射,类似于:

代码语言:javascript
复制
var MySyncGlobalMap = sync.Map{}

在一个事件中,我用预期的结构填充了这个映射,名为map[int64]map[string]interface{}。因此,基本上,我希望填充同步映射,键作为int64,值作为结构map[string]interface{}的另一个同步映射。下面是我如何填充地图:

代码语言:javascript
复制
//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)

现在将有多个线程访问这个映射并执行一些操作。内部同步映射将不断更新。在内部同步映射的键上完成处理后,该键将从该映射中删除。

一旦内部同步映射变为空,我将知道作业已经完成。

现在,由于有多个线程访问此映射,所以我收到了恐慌:

致命错误:并发读写

我仍然在想,即使在使用同步映射之后,我也面临着这个问题。

有人能指出我做错了什么吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-12-20 06:20:37

我想出了密码的问题所在。我使用sync.Map作为值类型,而不是指针。

所以,我在复制潜在的互斥体。在读/写操作时,锁位于副本上,而不是原始互斥体上。

更改映射以使用指针解决了问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47864261

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档