为了账号安全,请及时绑定邮箱和手机立即绑定

测试并发映射读取和映射写入

测试并发映射读取和映射写入

Go
翻过高山走不出你 2023-06-26 17:14:08
我是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 ),以帮助捕获此类常见错误。


查看完整回答
反对 回复 2023-06-26
  • 1 回答
  • 0 关注
  • 116 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信