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

问题描述 投票:-1回答:2

我有这样的功能:

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

    lock.Lock()
    defer lock.Unlock()

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

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

go deferred subroutine goroutine
2个回答
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()
}

4
投票

不,只要go语句完成执行(也就是说,Go运行时创建一个新的goroutine并将其放在某个运行队列上),函数的执行就会继续,并且由于函数的主体在那里结束,所以函数延迟了它会运行。

goroutine之间的同步只能通过使用来自sync层次结构的包中的基元的通道操作明确地发生。

© www.soinside.com 2019 - 2024. All rights reserved.