defer 会一直等到子程序执行完吗?
Will defer be waiting until subroutine finishes execution?
我有这样的功能:
func TestDefer(lock sync.RWMutex, wait time.Duration) {
lock.Lock()
defer lock.Unlock()
// start goroutine
go func() {
time.Sleep(wait)
}()
}
我很想知道lock.Unlock()
什么时候执行?它是否与子例程同步 go func()
?它会等到它完成吗?
没有。 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()
}
不,一旦 go
语句完成执行(即 Go 运行time 创建一个新的 goroutine 并将其放在某个 运行 队列中),函数的执行继续,并且由于函数体到此结束,
其中延迟的功能将 运行.
goroutine 之间的同步只会显式发生——通过使用 sync
层次结构包中的原语的通道操作。
我有这样的功能:
func TestDefer(lock sync.RWMutex, wait time.Duration) {
lock.Lock()
defer lock.Unlock()
// start goroutine
go func() {
time.Sleep(wait)
}()
}
我很想知道lock.Unlock()
什么时候执行?它是否与子例程同步 go func()
?它会等到它完成吗?
没有。 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()
}
不,一旦 go
语句完成执行(即 Go 运行time 创建一个新的 goroutine 并将其放在某个 运行 队列中),函数的执行继续,并且由于函数体到此结束,
其中延迟的功能将 运行.
goroutine 之间的同步只会显式发生——通过使用 sync
层次结构包中的原语的通道操作。