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

标签 go concurrency hashmap synchronization

我在使用 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/

相关文章:

map - 将映射键/值存储在持久文件中

arrays - 如何通过引用将结构数组作为接口(interface)传递

c# - 使用多个任务从大型集合中检索所有记录

java - 在多个 jvm 实例中运行 java 代码

java - 如何在用户指定的时间内运行线程?

java - java HashMap 内部是如何工作的?

Java HashMap : How to get key from value?

go - 如何从html上传目录到golang服务器?

go - func 的语法 Golang 错误

c# - 如何将散列键与 C# 中的值列表映射?