如何安全地允许当前访问嵌套地图?

How to safely allow current access to nested maps in go?

我对如何确保对嵌套地图的安全并发访问感到有点困惑。 最初我的设置是这样的,有点我意识到我需要能够至少锁定一张地图。

map[string]map[string]Dish

经过一番思考,我设想的结构如下所示:

type Manager struct {
    mu sync.RWMutex
    locations map[string]Restaurant
}
type Restaurant struct {
    mu sync.RWMutex
    menu map[string]Dish
}
type Dish struct {
    name string
    price string
    vegan bool
}

我的基本理解如下: 如果我想添加一个新的 Restaurantlocations,我需要锁定 Manager。 如果我想将 Dish 添加或修改为 menu,我需要锁定 Restaurant,但我不确定是否需要锁定 Manager 】 还有。 同样,如果我想访问 Manager 中的值,我不确定是否也需要锁定 Restaurant

我尝试(未成功)在使用 -race 标志时强制进行数据竞争,所以我不确定锁定 Manager 是否随时 Restaurant 发生了变异,并且锁定Restaurant 每次我访问 Manager 是必要的,或者如果我尝试强制比赛没有奏效。

首先,你不想被复制锁,所以你需要使用指针:

type Manager struct {
    mu sync.RWMutex
    locations map[string]*Restaurant
}
type Restaurant struct {
    mu sync.RWMutex
    menu map[string]Dish
}

一旦你有一个 *Restaurant 实例,你必须锁定它以写入 menu,并 rlock 它以读取 menu.

要通过地图查找找到餐厅,您需要锁定 Manager,要向 Manager 添加内容,您需要锁定它。

所以如果你想从上往下走,你必须同时锁定经理和餐厅。您还必须确保每次执行此操作时都以相同的顺序锁定它们(首先是经理,其次是餐厅)以避免死锁。