如何安全地允许当前访问嵌套地图?
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
}
我的基本理解如下:
如果我想添加一个新的 Restaurant
到 locations
,我需要锁定 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
添加内容,您需要锁定它。
所以如果你想从上往下走,你必须同时锁定经理和餐厅。您还必须确保每次执行此操作时都以相同的顺序锁定它们(首先是经理,其次是餐厅)以避免死锁。
我对如何确保对嵌套地图的安全并发访问感到有点困惑。 最初我的设置是这样的,有点我意识到我需要能够至少锁定一张地图。
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
}
我的基本理解如下:
如果我想添加一个新的 Restaurant
到 locations
,我需要锁定 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
添加内容,您需要锁定它。
所以如果你想从上往下走,你必须同时锁定经理和餐厅。您还必须确保每次执行此操作时都以相同的顺序锁定它们(首先是经理,其次是餐厅)以避免死锁。