[英]Data race with list.List concurrent access with mutexes
我正在进行数据竞赛,我不知道为什么。 使用-race
命令运行测试时,我已将其范围缩小到尝试访问list.List
在从list.List
读取时,列表,但是我的互斥体似乎没有任何作用。
我在数组中有多个* list.Lists,如下所示:
type MyList struct {
mutex sync.Mutex
*list.List
}
type SomeObj struct {
data string
}
var myListOfLists [10]MyList
我正在从列表中读取和写入,如下所示:
list := myListOfLists[someIndex]
list.mutex.Lock()
for e := list.Front(); e != nil; e = e.Next() {
if (...) {
list.MoveToFront(e)
}
}
list.mutex.Unlock()
在另一个goroutine中,还尝试读取并建立完整列表以返回
var fullCopy []*SomeObj
list := myListOfLists[someIndex]
list.mutex.Lock()
for e := list.Front(); e != nil; e = e.Next() {
fullCopy = append(fullCopy, e.Value.(SomeObj))
}
list.mutex.Unlock()
语句list := myListOfLists[someIndex]
将数组元素复制到变量list
。 这将复制互斥锁,从而阻止互斥锁工作。 go vet
命令报告此问题。
您可以通过使用指向数组元素的指针来避免复制:
list := &myListOfLists[someIndex]
另一种方法是使用指向MyList
的指针数组。 在使用它时,最好在MyList
使用列表值而不是列表指针:
type MyList struct {
mutex sync.Mutex
list.List
}
var myListOfLists [10]*MyList
for i := range myListOfLists {
myListOfLists[i] = &MyList{}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.