簡體   English   中英

與列表進行數據競爭。使用互斥體列出並發訪問

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM