gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 02:10:42 26 4
gpt4 key购买 nike

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com