最新公告
  • 欢迎您光临码农资源网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!加入我们
  • 这是 Go 中的竞争条件吗

    这是 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)
            }
        }
    }
    
    想要了解更多内容,请持续关注码农资源网,一起探索发现编程世界的无限可能!
    本站部分资源来源于网络,仅限用于学习和研究目的,请勿用于其他用途。
    如有侵权请发送邮件至1943759704@qq.com删除

    码农资源网 » 这是 Go 中的竞争条件吗
    • 7会员总数(位)
    • 25846资源总数(个)
    • 0本周发布(个)
    • 0 今日发布(个)
    • 292稳定运行(天)

    提供最优质的资源集合

    立即查看 了解详情