登录
首页 >  Golang >  Go问答

为什么当我有两个 go 例程时循环中的代码未执行

来源:stackoverflow

时间:2024-03-03 14:30:30 318浏览 收藏

大家好,今天本人给大家带来文章《为什么当我有两个 go 例程时循环中的代码未执行》,文中内容主要涉及到,如果你对Golang方面的知识点感兴趣,那就请各位朋友继续看下去吧~希望能真正帮到你们,谢谢!

问题内容

我在 golang 中遇到问题

var a = 0
func main() {
        go func() {
                for {
                        a = a + 1
                }
        }()
        time.Sleep(time.Second)
        fmt.Printf("result=%d\n", a)
}
  • 预期:结果=(一个大整数)
  • 结果:结果=0

解决方案


你有竞争条件, 使用 -race 标志运行你的程序

go run -race main.go
==================
warning: data race
read at 0x0000005e9600 by main goroutine:
  main.main()
      /home/jack/project/goproject/src/gitlab.com/hooshyar/gonetworklab/stackoverflow/race/main.go:17 +0x6c

previous write at 0x0000005e9600 by goroutine 6:
  main.main.func1()
      /home/jack/project/goproject/src/gitlab.com/hooshyar/gonetworklab/stackoverflow/race/main.go:13 +0x56

goroutine 6 (running) created at:
  main.main()
      /home/jack/project/goproject/src/gitlab.com/hooshyar/gonetworklab/stackoverflow/race/main.go:11 +0x46
==================
result=119657339
found 1 data race(s)
exit status 66

解决方案是什么?
有一些解决方案,一个解决方案是使用互斥锁:

var a = 0
func main() {
    var mu sync.Mutex

    go func() {
        for {
            mu.Lock()
            a = a + 1
            mu.Unlock()
        }
    }()
    time.Sleep(3*time.Second)
    mu.Lock()
    fmt.Printf("result=%d\n", a)
    mu.Unlock()
}

在任何读写锁定互斥体然后解锁它之前,现在您没有任何竞争,并且结果将在最后为 big int 。
有关更多信息,请阅读本主题。
Data races in Go(Golang) and how to fix them 还有这个

Golang concurrency - data races

以上就是《为什么当我有两个 go 例程时循环中的代码未执行》的详细内容,更多关于的资料请关注golang学习网公众号!

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