我有这样的功能:
func TestDefer(lock sync.RWMutex, wait time.Duration) {
lock.Lock()
defer lock.Unlock()
// start goroutine
go func() {
time.Sleep(wait)
}()
}
我很想知道何时执行lock.Unlock()
?它是否与子程序go func()
同步?它会等到它完成吗?
答案 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()
}