登录
首页 >  Golang >  Go问答

为何在这个关于Golang Goroutine执行顺序的代码中,数字“2”先被打印出来?

来源:stackoverflow

时间:2024-03-14 17:48:28 366浏览 收藏

欢迎各位小伙伴来到golang学习网,相聚于此都是缘哈哈哈!今天我给大家带来《为何在这个关于Golang Goroutine执行顺序的代码中,数字“2”先被打印出来?》,这篇文章主要讲到等等知识,如果你对Golang相关的知识非常感兴趣或者正在自学,都可以关注我,我会持续更新相关文章!当然,有什么建议也欢迎在评论留言提出!一起学习!

问题内容

package main

import (
    "fmt"
    "sync"
)

func main() {
    runtime.GOMAXPROCS(1)
    w := &sync.WaitGroup{}
    w.Add(2)
    go func() {
        fmt.Println("1")
        w.Done()
    }()
    go func() {
        fmt.Println("2")
        w.Done()
    }()
    w.Wait()
}

https://play.golang.org/p/esi1mkao1x_s

呃,我不知道为什么先打印“2”。

我想查一下信息。但我不知道应该查什么信息。所以我在那里发布问题寻求帮助。

我认为第一个 goroutine 是第一个压入队列的。它应该首先打印。


解决方案


您没有将 2 个启动的 goroutine 彼此同步,因此无法保证它们的运行顺序。您同步的唯一事情是主 goroutine 等待其他 2 个 goroutine 完成,但它们的顺序将是未定义的。

下面是一个使用另一个 sync.waitgroup 同步订单的示例:

w := &sync.waitgroup{}
w.add(2)

w2 := &sync.waitgroup{}
w2.add(1)
go func() {
    fmt.println("1")
    w.done()
    w2.done()
}()
go func() {
    w2.wait()
    fmt.println("2")
    w.done()
}()
w.wait()

输出将为(在 Go Playground 上尝试):

1
2

基本上,第二个 goroutine 等待 w2,一旦完成,它就会在第一个 goroutine 中调用。

请注意,由于第二个 goroutine 等待第一个 goroutine,因此主 goroutine 只需等待第二个 goroutine 就足够了(这意味着同时等待两个 goroutine)。所以上面的例子可以这样写:

w2 := &sync.WaitGroup{}
w2.Add(1)
go func() {
    fmt.Println("1")
    w2.Done()
}()

w := &sync.WaitGroup{}
w.Add(1)
go func() {
    w2.Wait()
    fmt.Println("2")
    w.Done()
}()
w.Wait()

输出是一样的。在 Go Playground 上试试这个。

今天关于《为何在这个关于Golang Goroutine执行顺序的代码中,数字“2”先被打印出来?》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

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