为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
尚方宝剑之说 2022-05-18 14:49:03
我对如何确保对嵌套地图的安全并发访问感到有些困惑。最初我的设置是这样的,我意识到我需要能够锁定至少一张地图。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。如果我想添加或修改 a Dishto menu,我需要 lock Restaurant,但我不确定是否还需要 lock the Manager。同样,如果我想从 访问值Manager,我不确定是否也需要锁定Restaurant。我曾尝试(未成功)在使用-race标志时强制数据竞争,所以我不确定是否Manager随时锁定Restaurant已发生变化,并且Restaurant每次访问Manager时都需要锁定,或者我是否尝试强制竞争没有奏效。
查看完整描述

1 回答

?
慕少森

TA贡献2019条经验 获得超9个赞

首先,您不想复制锁,因此您需要使用指针:


type Manager struct {

    mu sync.RWMutex

    locations map[string]*Restaurant

}

type Restaurant struct {

    mu sync.RWMutex

    menu map[string]Dish

}

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


要通过地图查找获得餐厅,您需要锁定Manager,而要向 中添加东西Manager,您需要锁定它。


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


查看完整回答
反对 回复 2022-05-18
  • 1 回答
  • 0 关注
  • 97 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信