gpt4 book ai didi

go - 锁定golang递归映射

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

我有一个类似递归映射的结构,如下所示:

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/

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