我有这样的功能:
func TestDefer(lock sync.RWMutex, wait time.Duration) { lock.Lock() defer lock.Unlock() // start goroutine go func() { time.Sleep(wait) }() }
我很想知道lock.Unlock()什么时候会被执行?是否与子程序go func()同步?它会一直等到结束吗?
lock.Unlock()
go func()
xxhby3vn1#
不,只要go语句完成执行(也就是说,Go运行时创建一个新的goroutine并将其放在某个运行队列中),函数的执行就会继续,并且由于函数的主体在那里结束,因此延迟的函数将运行。goroutine之间的同步只会显式地发生通过使用sync层次结构包中的原语的通道操作。
go
sync
okxuctiv2#
不,延迟不会等你完成你的程序。如果你想这样做,等到go例程完成使用sync.WaitGroup执行。
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() }
2条答案
按热度按时间xxhby3vn1#
不,只要
go
语句完成执行(也就是说,Go运行时创建一个新的goroutine并将其放在某个运行队列中),函数的执行就会继续,并且由于函数的主体在那里结束,因此延迟的函数将运行。goroutine之间的同步只会显式地发生通过使用
sync
层次结构包中的原语的通道操作。okxuctiv2#
不,延迟不会等你完成你的程序。如果你想这样做,等到go例程完成使用
sync.WaitGroup
执行。