2 回答

TA貢獻1786條經驗 獲得超13個贊
Golang 1.6之前并發讀可以,并發寫不行,寫并發讀可以。從 Golang 1.6 開始,map 在寫入時無法讀取。所以在 Golang 1.6 之后,并發訪問映射應該是這樣的:
package main
import (
"sync"
"time"
)
var m = map[string]int{"a": 1}
var lock = sync.RWMutex{}
func main() {
go Read()
time.Sleep(1 * time.Second)
go Write()
time.Sleep(1 * time.Minute)
}
func Read() {
for {
read()
}
}
func Write() {
for {
write()
}
}
func read() {
lock.RLock()
defer lock.RUnlock()
_ = m["a"]
}
func write() {
lock.Lock()
defer lock.Unlock()
m["b"] = 2
}
或者你會得到以下錯誤:
添加:
您可以通過使用檢測種族 go run -race race.go
更改read功能:
func read() {
// lock.RLock()
// defer lock.RUnlock()
_ = m["a"]
}
另一種選擇:
眾所周知,map
是由桶實現的,sync.RWMutex
會鎖定所有的桶。concurrent-map用于fnv32
對鍵進行分片,每個存儲桶使用一個sync.RWMutex
.

TA貢獻1810條經驗 獲得超5個贊
運行時添加了輕量級、盡力而為的并發誤用映射檢測。與往常一樣,如果一個 goroutine 正在寫入地圖,則沒有其他 goroutine 應該同時讀取或寫入地圖。如果運行時檢測到這種情況,它會打印診斷信息并使程序崩潰。找出更多問題的最好方法是在比賽檢測器下運行程序,這將更可靠地識別比賽并提供更多細節。
映射是復雜的、自重組的數據結構。并發讀寫訪問未定義。
沒有代碼,沒有什么可說的。
- 2 回答
- 0 關注
- 190 瀏覽
添加回答
舉報