defer会等待子程序执行完毕吗?

Rud*_*koŭ 4 go subroutine goroutine defer-keyword

我有这样的功能:

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

    lock.Lock()
    defer lock.Unlock()

    // start goroutine 
    go func() {
        time.Sleep(wait)
    }()
}
Run Code Online (Sandbox Code Playgroud)

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

kos*_*tix 7

不,一旦go语句完成执行(即 Go 运行时创建一个新的 goroutine 并将其放入某个运行队列中),该函数就会继续执行,并且由于该函数的主体在此结束,\n函数会延迟在它会运行。

\n\n

goroutine 之间的同步只能通过使用层次结构包中的原语的通道操作显式地\xe2\x80\x94 发生sync

\n


ved*_*yas 5

不。Defer 不会等待您的 go 例程完成。如果您想这样做,请等到 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()
}
Run Code Online (Sandbox Code Playgroud)