同步 WaitGroup 不等待 goroutine 分配指针

假设我有以下代码(操场):


package main


import (

    "fmt"

    "sync"

)


func createStr() *string {

    tmp := "foo"

    return &tmp

}


func main() {

    var (

        s  *string

        wg sync.WaitGroup

    )


    go func() {

        wg.Add(1)

        defer wg.Done()


        s = createStr()

    }()


    wg.Wait()

    fmt.Printf("s after: %v", s)

}

我本来期望 s 不等于 nil。


但是,如果我添加一个小等待,我会得到 s != nil ( playground ):


package main


import (

    "fmt"

    "sync"

    "time"

)


func createStr() *string {

    tmp := "foo"

    return &tmp

}


func main() {

    var (

        s  *string

        wg sync.WaitGroup

    )


    go func() {

        wg.Add(1)

        defer wg.Done()


        s = createStr()

    }()


    wg.Wait()

    time.Sleep(time.Second)


    fmt.Printf("s after: %v", s)

}

这只是在我编写的程序中造成了一个错误。发生了什么并sync.WaitGroup没有导致我的程序等待 s 在我的 go func 中被分配一个字符串指针?


繁花不似锦
浏览 109回答 1
1回答

墨色风雨

您对Add方法的放置sync.WaitGroup是错误的。不要Add在 goroutine(这里是匿名 goroutine)中使用,而是在等待它的 goroutine(这里是 main goroutine)中使用它。您的代码中发生的一种可能情况是wg.Wait()没有等待,因为 goroutinewg.Add(1)还没有被调用,因此s == nil. 下面的代码解决了这个问题:去游乐场package mainimport (    "fmt"    "sync")func createStr() *string {    tmp := "foo"    return &tmp}func main() {    var (        s  *string        wg sync.WaitGroup    )    // Use wg.Add() here    wg.Add(1)    go func() {        defer wg.Done()        s = createStr()    }()    wg.Wait()    fmt.Printf("s after: %v", *s)}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go