可靠的线程安全映射

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



慕姐4208626
浏览 98回答 1
1回答

森栏

对于这些场景,可用于通过获取您希望线程安全的代码周围的锁sync.Mutex来确保只允许进行一次修改。var mu sync.Mutexfunc 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.RWMutexfunc readMap(key string) {    mu.RLock()    defer mu.RUnlock()    return yourMap[key]}func updateMap(key, value string) {    mu.Lock()    defer mu.Unlock()    yourMap[key] = value}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go