【问题标题】:test concurrent map read and map write测试并发映射读取和映射写入
【发布时间】:2019-06-25 07:18:58
【问题描述】:

我是 Go 语言的新手。当我执行代码时,我得到以下错误:
致命错误:并发映射读取和映射写入

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
}

谁能告诉我为什么?

【问题讨论】:

    标签: go


    【解决方案1】:

    您必须传递一个指向您的sync.RWMutex 值的指针。否则,每次将互斥锁传递给新函数时,您都会对其进行复制,因此不会发生实际锁定。

    go vet 工具将为您检测此错误。您应该在所有代码上运行go vet(可能还有other linters),以帮助捕获此类常见错误。 Related reading.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-31
      • 2017-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多