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

在并发环境中从地图中删除是否安全?在 Golang

在并发环境中从地图中删除是否安全?在 Golang

Go
梦里花落0921 2022-01-04 21:14:16
在从地图上移除物品之前,我是否需要锁定?package mainimport (     "errors"    "sync"    "time")type A struct {    Error error}func (a *A) Job() {//    ... more job}var l sync.RWMutexfunc generate() {    l.Lock()    values["key1"] = A{}    l.Unlock()    l.Lock()    values["key2"] = A{}    values["key3"] = A{}    l.Unlock() //   ...    l.Lock()    values["key1919"] = A{Error: errors.New("oh...")}    l.Unlock() //   ...    l.Lock()    values["key99999999999"] = A{}    l.Unlock()}var values map[string]Afunc main() {    values = make(map[string]A)    go generate()    for {        l.RLock()        for key, value := range values {            if value.Error != nil {                delete(values, key)    // it's safe? or you need to take a lock?            } else {                value.Job()            }           }        l.RUnlock()        time.Sleep(10 * time.Second)    }}变体:删除范围内不用担心在切片和单独的范围中添加键以删除它们l.RUnlock(); l.Lock(); 删除(值,键);l.解锁;l.RLock(); 在范围内go l.delete(key) // gorutin 飞溅哪种变体是锁定/解锁的有效移除?
查看完整描述

1 回答

?
POPMUISE

TA贡献1765条经验 获得超5个赞

从映射中删除被视为写入操作,并且必须与所有其他读取和写入进行序列化。如果我正确理解您的问题,那么是的,您需要批量删除以备后用,或者放弃读锁并获取写锁以完成删除。


运行时会尝试检测并发读取和写入,并且会因以下情况之一而崩溃:


fatal error: concurrent map writes

fatal error: concurrent map read and map write


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

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号