为了账号安全,请及时绑定邮箱和手机立即绑定

同步 WaitGroup 不等待 goroutine 分配指针

同步 WaitGroup 不等待 goroutine 分配指针

Go
繁花不似锦 2022-07-11 10:39:39
假设我有以下代码(操场):package mainimport (    "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 mainimport (    "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 中被分配一个字符串指针?
查看完整描述

1 回答

?
墨色风雨

TA贡献1853条经验 获得超6个赞

您对Add方法的放置sync.WaitGroup是错误的。不要Add在 goroutine(这里是匿名 goroutine)中使用,而是在等待它的 goroutine(这里是 main goroutine)中使用它。


您的代码中发生的一种可能情况是wg.Wait()没有等待,因为 goroutinewg.Add(1)还没有被调用,因此s == nil. 下面的代码解决了这个问题:


去游乐场


package main


import (

    "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)

}


查看完整回答
反对 回复 2022-07-11
  • 1 回答
  • 0 关注
  • 108 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号