我有一个类似递归映射的结构,如下所示:
type RecurseTable struct {
Table map[string]*RecurseTable
// Other fields
sync.RWMutex
}
如果我要从多个 goroutine 访问这个结构,我该如何锁定它呢?假设我正在从顶级 map 读取数据并写入第三级嵌套 map 。说这不会导致任何问题是否准确,因为更改第三层(并因此通过两个指针间接访问)不应该影响顶层 map ?
类似地,如果我有一个 goroutines 池,所有修改信息都在第二级嵌套结构中,我是否只需要锁定每个第二级映射,因为顶级映射只包含指向的指针嵌套的递归表?还是我必须同时锁定顶级映射和嵌套结构,因为该结构可能会以某种方式重新分配到内存中,从而导致对作为值存储在顶级映射中的指针进行更改?
另一种情况是在从二级结构读取的同时向顶级映射添加键。是否可以安全地假设由于新 key 而对顶级映射进行的任何重组都不会影响内存中二级结构的位置,因此在读取时不需要锁定结构?
我的目标是尽量减少整个递归结构的全局锁,以便我的 goroutine 可以并行处理结构的不同部分,同时将锁争用降至最低。我想我的问题的核心是关于 Golang 中的 map 如何调整大小。
最佳答案
来自Go maps in action博文:
Maps are not safe for concurrent use: it's not defined what happens when you read and write to them simultaneously. If you need to read from and write to a map from concurrently executing goroutines, the accesses must be mediated by some kind of synchronization mechanism. One common way to protect maps is with
sync.RWMutex
.
当您将 map 指针提供给其他 map 时,您可以安全地独立于其他 map (兄弟或后代)锁定 map :即使您在使用其后代时删除 map 条目,也不会成为问题,因为它们的引用将被保留,直到您释放指针(即,保存它们的 var 被删除)。
关于go - 锁定golang递归映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25133116/