首页  >  文章  >  后端开发  >  这是 Go 中的竞争条件吗

这是 Go 中的竞争条件吗

王林
王林转载
2024-02-15 09:06:08550浏览

这是 Go 中的竞争条件吗

php小编苹果在这篇文章中将为您解答一个常见的问题:“这是Go中的竞争条件吗?”在编写并发程序时,竞争条件是一个常见的问题,它可能导致数据不一致以及其他意想不到的结果。在Go语言中,我们可以使用互斥锁、通道等机制来避免竞争条件的发生。让我们一起来探讨一下吧!

问题内容

func main() {
    m := map[string]int{
        "foo": 42,
        "bar": 1337,
    }

    go func() {
        time.Sleep(1 * time.Second)
        tmp := map[string]int{
            "foo": 44,
            "bar": 1339,
        }

        m = tmp
    }()

    for {
        val := m["foo"]
        fmt.Println(val)
    }
}

我在很多包中都看到了这个。

为什么这不被视为竞争条件?

go run -race . 没有错误。

解决方法

正如@volker 所指出的,这是一场数据竞赛。而且由于只有一次写入,因此很难被检测到。这是一个修改后的演示,可以轻松触发数据争用错误:

package main

import (
    "fmt"
    "time"
)

func main() {
    m := map[string]int{
        "foo": 42,
        "bar": 1337,
    }

    done := make(chan any)

    go func() {
        for i := 0; i < 100; i++ {
            time.Sleep(time.Microsecond)
            tmp := map[string]int{
                "foo": 44,
                "bar": 1339,
            }

            m = tmp
        }

        close(done)
    }()

    for {
        select {
        case <-done:
            return
        default:
            val := m["foo"]
            fmt.Println(val)
        }
    }
}

以上是这是 Go 中的竞争条件吗的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文转载于:stackoverflow.com。如有侵权,请联系admin@php.cn删除