当前位置: > > > > 如何在 Golang 中锁定特定映射的索引以进行并发读/写
如何在 Golang 中锁定特定映射的索引以进行并发读/写
来源:stackoverflow
2024-04-19 21:27:31
0浏览
收藏
各位小伙伴们,大家好呀!看看今天我又给各位带来了什么文章?本文标题是《如何在 Golang 中锁定特定映射的索引以进行并发读/写》,很明显是关于Golang的文章哈哈哈,其中内容主要会涉及到等等,如果能帮到你,觉得很不错的话,欢迎各位多多点评和分享!
问题内容
我想知道是否有一种方法可以在并发读/写期间仅锁定映射中的索引。我对 golang 和并行性还很陌生,如果答案很明显,我很抱歉。
func check(a, b []string) map[string]int {
var res = make(map[string]int)
go func() {
for _, v := range a {
res[v]++
}
}()
go func() {
for _, v := range b {
res[v]++
}
}()
return res
}
最终这段代码会由于并发的映射读/写而发生恐慌。所以我们应该添加互斥锁来锁定地图。
var m sync.Mutex
go func() {
for _, v := range a {
m.Lock()
res[v]++
m.Unlock()
}
}()
go func() {
for _, v := range b {
m.Lock()
res[v]++
m.Unlock()
}
}()
但是根据我的理解,m.lock()会锁定我的整个地图?锁定所有内容是不是开销太大了?这让我很烦恼,因为我认为这段代码可能不会比线性运行更快。我可以只锁定 map["some key"] 处的映射,以便我的第二个 goroutine 仍然可以在 map["some other key"] 中写入吗?
解决方案
来自
并发地图
同步包中的新映射类型是具有摊销恒定时间加载、存储和删除的并发映射。多个 goroutine 同时调用 Map 的方法是安全的。
GO 团队为您打造了一款!
好了,本文到此结束,带大家了解了《如何在 Golang 中锁定特定映射的索引以进行并发读/写》,希望本文对你有所帮助!关注米云公众号,给大家分享更多Golang知识!
