可靠的线程安全映射

问题描述 投票:0回答:1

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

dictionary go concurrency discord
1个回答
0
投票

对于这些情况,sync.Mutex可用于通过在要成为线程安全的代码周围获取lock来确保仅允许进行一次修改。

sync.Mutex

Mutex确保可以允许ONLY ONE goroutine访问locked代码,这意味着在您的情况下,只能执行一项操作,无论是读取还是写入。

为了获得更高的效率,您应该考虑使用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 } ,因为在读取地图时可能不想锁定地图。从GoDoc:

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

sync.RWMutex
© www.soinside.com 2019 - 2024. All rights reserved.