Go语言 defer会一直等到子程序执行完毕吗?

sgtfey8w  于 2023-10-14  发布在  Go
关注(0)|答案(2)|浏览(108)

我有这样的功能:

func TestDefer(lock sync.RWMutex, wait time.Duration) {

    lock.Lock()
    defer lock.Unlock()

    // start goroutine 
    go func() {
        time.Sleep(wait)
    }()
}

我很想知道lock.Unlock()什么时候会被执行?是否与子程序go func()同步?它会一直等到结束吗?

xxhby3vn

xxhby3vn1#

不,只要go语句完成执行(也就是说,Go运行时创建一个新的goroutine并将其放在某个运行队列中),函数的执行就会继续,并且由于函数的主体在那里结束,因此延迟的函数将运行。
goroutine之间的同步只会显式地发生通过使用sync层次结构包中的原语的通道操作。

okxuctiv

okxuctiv2#

不,延迟不会等你完成你的程序。如果你想这样做,等到go例程完成使用sync.WaitGroup执行。

func TestDefer(lock sync.RWMutex, wait time.Duration) {
    wg := new(sync.WaitGroup)
    lock.Lock()
    defer lock.Unlock()

    wg.Add(1)
    // start goroutine 
    go func() {
        defer wg.Done()
        time.Sleep(wait)
    }()
    wg.Wait()
}

相关问题