登录
首页 >  Golang >  Go问答

Sync WaitGroup 不等待 goroutine 分配指针

来源:stackoverflow

时间:2024-03-12 18:21:25 409浏览 收藏

学习Golang要努力,但是不要急!今天的这篇文章《Sync WaitGroup 不等待 goroutine 分配指针》将会介绍到等等知识点,如果你想深入学习Golang,可以关注我!我会持续更新相关文章的,希望对大家都能有所帮助!

问题内容

假设我有以下代码(演示):

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 (演示):

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 中分配字符串指针?


解决方案


您为 sync.waitgroup 放置的 add 方法是错误的。不要在 goroutine(此处为匿名 goroutine)内使用 add,而是在将等待它的 goroutine(此处为 main goroutine)中使用它。

代码中可能发生的情况是 wg.wait() 没有等待,因为 goroutine 的 wg.add(1) 尚未被调用,因此 s == nil。以下代码修复了该问题:

Go Playground

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

理论要掌握,实操不能落!以上关于《Sync WaitGroup 不等待 goroutine 分配指针》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!

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