[英]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.