猿问

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

我是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

}

谁能告诉我为什么?


翻过高山走不出你
浏览 119回答 1
1回答

一只萌萌小番薯

您必须传递一个指向您的sync.RWMutex值的指针。否则,每次将互斥体传递给新函数时,您都会复制该互斥体,因此不会发生实际的锁定。该go vet工具将为您检测到此错误。您应该在所有代码上运行go vet(以及可能的其他 linter ),以帮助捕获此类常见错误。
随时随地看视频慕课网APP

相关分类

Go
我要回答