我有一个递归的类似于地图的结构,它看起来像这样:
type RecurseTable struct {
Table map[string]*RecurseTable
// Other fields
sync.RWMutex
}
如果我要从多个goroutine访问这个结构,我该如何锁定它呢?假设我正在从顶层map中读取并写入第三层嵌套map,那么说改变第三层(因此间接地通过两个指针)不应该影响顶层map,这是准确的吗?
同样,如果我有一个goroutine池,所有goroutine都在修改第二级嵌套结构中的信息,那么我只需要锁定每个第二级map,因为顶层map只包含对嵌套RecurseTable的指针,这是正确的吗?还是说我必须同时锁定顶层map和嵌套结构,因为该结构可能会在内存中重新分配,导致将其作为值存储在顶层map中的指针发生更改?
另一种情况是在读取第二级结构时向顶层map添加键。可以安全地假设由于新键而对顶层map进行的任何重组都不会影响内存中第二级结构的位置,因此在读取时无需锁定该结构吗?
我的目标是将整个递归结构的全局锁最小化,以便我的goroutine可以并行地处理结构的不同部分,最小化锁争用。我想问的核心问题是maps在Golang中如何调整大小。