有哪位高手帮我看看这段代码有什么问题

hitperson · 2017-12-01 08:55:58 · 1363 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2017-12-01 08:55:58 的主题,其中的信息可能已经有所发展或是发生改变。

package main

import "fmt"
import "sync"

func main(){
    var wg sync.WaitGroup
    wg.Add(1)
    f(wg)
    wg.Wait()
    fmt.Println("exit from main")
}

func f(wg sync.WaitGroup){
    defer func(){
        if e := recover(); e != nil {
            fmt.Println("caught panic")
        }
        wg.Done()
    }()
    go func(){
        defer func(){
            if e := recover(); e != nil {
                fmt.Println(e)
            }
        }()
        panic(1)
    }()
}

执行结果:

1
fatal error: all goroutines are asleep - deadlock!

goroutine 1 [semacquire]:
sync.runtime_Semacquire(0xc42000e23c)
    /home/zenglin/Downloads/go1.8/src/runtime/sema.go:47 +0x34
sync.(*WaitGroup).Wait(0xc42000e230)
    /home/zenglin/Downloads/go1.8/src/sync/waitgroup.go:131 +0x7a
main.main()
    /mnt/hgfs/src/test/test.go:10 +0x6c
exit status 2

怎么会所有的协程都阻塞?无标题.png


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1363 次点击  
加入收藏 微博
5 回复  |  直到 2017-12-26 05:44:03
polaris
polaris · #1 · 7年之前

改为:func f(wg *sync.WaitGroup) 即传指针

hitperson
hitperson · #2 · 7年之前

thank you

18393910396
18393910396 · #3 · 7年之前

{{image.png(uploading...)}} 。A,B 2个defer 的执行过程。 我是这样理解的,进入函数f:(1) 先执行go ,然后panic (2)执行B defer,不管 B defer有没有执行完,然后就执行A defer

请问我这样理解正确吗?

18393910396
18393910396 · #4 · 7年之前

我是这样理解的,进入函数f: (1) 先执行go ,然后panic (2)执行goroutine 里面的 defer,不管 go里面的 defer有没有执行完,然后就执行f函数的go外面的 defer 请问我这样理解正确吗?

abin
abin · #5 · 7年之前
1839391039618393910396 #4 回复

我是这样理解的,进入函数f: (1) 先执行go ,然后panic (2)执行goroutine 里面的 defer,不管 go里面的 defer有没有执行完,然后就执行f函数的go外面的 defer 请问我这样理解正确吗?

go函数有可能还没执行就会执行 f 函数,多试几次就会出现image.png

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传