推迟等待子程序执行完毕?

时间:2018-03-05 10:25:25

标签: go deferred subroutine goroutine

我有这样的功能:

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

    lock.Lock()
    defer lock.Unlock()

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

我很想知道何时执行lock.Unlock()?它是否与子程序go func()同步?它会等到它完成吗?

2 个答案:

答案 0 :(得分:4)

不,只要go语句完成执行(即Go运行时创建一个新的goroutine并将其放在某个运行队列上),函数的执行就会继续,并且因为函数的正文在那里结束, 它中延迟的函数将运行。

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

答案 1 :(得分:2)

没有。 Defer不会等你的常规完成。 如果你想这样做,请等到使用sync.WaitGroup执行go例程。

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