我是go语言的新手。当我执行代码时,出现以下错误:fatal error:并发映射读取和映射写入func foo() { var m = map[string]int{"a": 1} var lock = sync.RWMutex{} go Read(m, lock) time.Sleep(1 * time.Second) go Write(m, lock) time.Sleep(1 * time.Minute)}func main() { foo()}func Read(m map[string]int, lock sync.RWMutex) { for { read(m, lock) }}func Write(m map[string]int, lock sync.RWMutex) { for { write(m, lock) }}func read(m map[string]int, lock sync.RWMutex) { lock.RLock() defer lock.RUnlock() _ = m["a"]}func write(m map[string]int, lock sync.RWMutex) { lock.Lock() defer lock.Unlock() m["b"] = 2}谁能告诉我为什么?
1 回答
一只萌萌小番薯
TA贡献1795条经验 获得超7个赞
您必须传递一个指向您的sync.RWMutex
值的指针。否则,每次将互斥体传递给新函数时,您都会复制该互斥体,因此不会发生实际的锁定。
该go vet
工具将为您检测到此错误。您应该在所有代码上运行go vet
(以及可能的其他 linter ),以帮助捕获此类常见错误。
- 1 回答
- 0 关注
- 116 浏览
添加回答
举报
0/150
提交
取消