gpt4 book ai didi

dictionary - 可靠的线程安全映射

转载 作者:行者123 更新时间:2023-12-01 22:13:58 25 4
gpt4 key购买 nike

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

最佳答案

对于这些场景, 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 因为您可能不想在阅读 map 时锁定 map 。来自 GoDoc:

A RWMutex is a reader/writer mutual exclusion lock. The lock can be held by an arbitrary number of readers or a single writer. The zero value for a RWMutex is an unlocked mutex.



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
}

关于dictionary - 可靠的线程安全映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61723416/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com