go - 锁定golang递归映射

标签 go locking goroutine

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

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/

相关文章:

用于构建 API 的类似 Express 的框架

go - 如何最好地保持一个长时间运行的 Go 程序运行?

arrays - 将带有用户输入的 slice 附加到函数中

multithreading - Qt中临界区的实现

android - 锁定 Android 设备以仅运行一个应用程序

sql-server - Delphi Firedac SQL Server : no error raised when update fails because record is locked

go - 并发地逐行读取文件

MySQL 错误 1064 : search query not working as expected

go - 是否有一些优雅的方式来暂停和恢复任何其他 goroutine?

go - 外部程序能否知道go程序中goroutine的个数?