我使用 Go 的经验是最近的,在审查一些代码时,我看到虽然它被写保护,但读取数据时存在问题。不是阅读本身,而是阅读和修改切片之间可能发生的修改。
type ConcurrentSlice struct {
sync.RWMutex
items []Item
}
type Item struct {
Index int
Value Info
}
type Info struct {
Name string
Labels map[string]string
Failure bool
}
如前所述,写作以这种方式受到保护:
func (cs *ConcurrentSlice) UpdateOrAppend(item ScalingInfo) {
found := false
i := 0
for inList := range cs.Iter() {
if item.Name == inList.Value.Name{
cs.items[i] = item
found = true
}
i++
}
if !found {
cs.Lock()
defer cs.Unlock()
cs.items = append(cs.items, item)
}
}
func (cs *ConcurrentSlice) Iter() <-chan ConcurrentSliceItem {
c := make(chan ConcurrentSliceItem)
f := func() {
cs.Lock()
defer cs.Unlock()
for index, value := range cs.items {
c <- ConcurrentSliceItem{index, value}
}
close(c)
}
go f()
return c
}
但是在收集切片的内容和修改它之间,可能会发生修改。可能是另一个例程修改了同一个切片,当该赋值时,它已经不存在了:slice[i] = item
处理这个问题的正确方法是什么?
我已经实现了这个方法:
func GetList() *ConcurrentSlice {
if list == nil {
denylist = NewConcurrentSlice()
return denylist
}
return denylist
}
我这样使用它:
concurrentSlice := GetList()
concurrentSlice.UpdateOrAppend(item)
但我知道在获取和修改之间,即使它实际上是立即的,另一个例程也可能修改了切片。以原子方式执行这两个操作的正确方法是什么?我阅读的切片 100% 是我修改的切片。因为如果我试图将一个项目分配给一个不再存在的索引,它会中断执行。
先感谢您!
幕布斯6054654
翻阅古今
慕哥6287543
拉莫斯之舞
慕娘9325324
相关分类