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

可靠的线程安全映射

可靠的线程安全映射

Go
慕姐4208626 2022-06-01 17:51:56
我正在为我的 Discord 机器人制作一个WaitForResponse功能,它可以工作,但即使机器人期待响应,用户仍然可以使用命令。我通过使用带有用户和频道 ID 的地图来解决这个问题,但随后我被可怕的fatal error: concurrent map read and write. 所以我尝试使用 a sync.Map,但是当我向命令发送垃圾邮件时它并不总是有效。当机器人期待响应时,我有时仍然可以运行命令。有什么方法可以确保在地图中添加和删除这些值?
查看完整描述

1 回答

?
森栏

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

对于这些场景,可用于通过获取您希望线程安全的代码周围的锁sync.Mutex来确保只允许进行一次修改。


var mu sync.Mutex


func readMap(key string) {

    mu.Lock()

    defer mu.Unlock()


    return yourMap[key]

}


func updateMap(key, value string) {

    mu.Lock()

    defer mu.Unlock()


    yourMap[key] = value

}

Mutex 确保只有一个goroutine 可以被允许访问锁定的代码,这意味着对于您的情况,只能执行一个操作,读取或写入。


为了提高效率,您应该考虑使用,sync.RWMutex因为您可能不想在读取地图时锁定地图。来自 GoDoc:


RWMutex 是读写器互斥锁。锁可以由任意数量的读取器或单个写入器持有。RWMutex 的零值是未锁定的互斥锁。


var mu sync.RWMutex


func readMap(key string) {

    mu.RLock()

    defer mu.RUnlock()


    return yourMap[key]

}


func updateMap(key, value string) {

    mu.Lock()

    defer mu.Unlock()


    yourMap[key] = value

}


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

添加回答

举报

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