首頁 >後端開發 >Golang >在 `range` 迭代期間並發存取 Go Maps 安全性嗎?

在 `range` 迭代期間並發存取 Go Maps 安全性嗎?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-12-14 10:02:10737瀏覽

Is Concurrent Access to Go Maps Safe During `range` Iteration?

在Go 中使用「範圍」並發存取地圖

Go 部落格文章「行動中的地圖」同時強調了同步的重要性同時強調了同步的重要性同時訪問地圖。然而,目前尚不清楚使用 range 關鍵字迭代映射是否構成「讀取」或「週轉」階段,以及在此過程中是否允許並發存取。

對 for 迴圈中的範圍表達式進行求值在迴圈開始前一次。這意味著映射值僅被訪問一次,對映射進行的任何後續修改都不會反映在迭代中。因此,只要在迭代映射時不修改映射本身,並發存取就是安全的。

為了確保執行緒安全,應該在進入循環之前對映射進行讀取鎖定,並在每次迭代後解鎖。這可以防止並發 goroutine 在此期間修改映射。下面的程式碼示範了這種技術:

func IterateMapKeys(iteratorChannel chan int) error {
    testMapLock.RLock()
    defer testMapLock.RUnlock()
    for k, v := range testMap {
        testMapLock.RUnlock()
        someFunc()
        testMapLock.RLock()
        if someCond {
            return someErr
        }
    }
    return nil
}

在持有寫鎖的同時修改不同 goroutine 中的映射可確保安全修改以及循環迭代器對更改的後續觀察。

但是,需要注意的是,這種鎖定機制只能防止並發訪問,而不能防止並發修改。並發修改仍然可以發生,但不會影響當前迭代。

以上是在 `range` 迭代期間並發存取 Go Maps 安全性嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn