登录
首页 >  Golang >  Go问答

go goroutine 的两段代码的性能令人困惑

来源:stackoverflow

时间:2024-04-05 16:12:36 189浏览 收藏

Golang不知道大家是否熟悉?今天我将给大家介绍《go goroutine 的两段代码的性能令人困惑》,这篇文章主要会讲到等等知识点,如果你在看完本篇文章后,有更好的建议或者发现哪里有问题,希望大家都能积极评论指出,谢谢!希望我们能一起加油进步!

问题内容

下面是一段代码,x的打印值是一个不定整数,eg: x = 359931570x = 325604846。性能预期。

package main

import (
        "fmt"
        "runtime"
        "time"
)

func main() {
        runtime.GOMAXPROCS(1)
        var x int = 1
        for i := 0; i < 2; i++ {
                go func() {
                        for {
                            x=add(x) // x=x+1 
                        }
                }()
        }
        time.Sleep(time.Second)
        fmt.Println("end")
        fmt.Println("x =", x)
}

func add(x int) int {
  return x+1
}

但是,如果我在代码中将 x=add(x) 替换为 x=x+1,则其输出始终为 x = 1 >。看起来goroutine中的代码没有执行。我无法理解这种行为,解释是什么?


正确答案


该代码存在数据争用,并且输出未定义。不过最后有办法解释为什么x=1

如果多个 Goroutine 在没有显式同步的情况下更新共享变量 x,则无法保证其他 Goroutine 会看到一个 Goroutine 对变量 x 所做的更新。因此,Go 内存模型允许主 Goroutine 永远看不到其他 Goroutine 的影响,并使用 x 的初始值。

为什么使用函数时会发生变化很有趣。但随后,出现了数据竞争,并且输出未定义。

文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《go goroutine 的两段代码的性能令人困惑》文章吧,也可关注golang学习网公众号了解相关技术文章。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>