2017-06-20 60 views
-1
package main 
import (
    "sync" 
    "time" 
) 
func main() { 
    var wg sync.WaitGroup 

    wg.Add(1) 

    go func() {   //A 
    wg.Wait() 
    println("wait exit") 
    }() 

    go func() { 
    time.Sleep(time.Second) 
    wg.Done() 
    }() 

    wg.Wait() 
    println("main exit") 
} 

结果:为什么主够程总是要调用的第二

wait exit 
main exit 

为什么不主的goroutine执行的println(“主退出”)第一,和主线程死,然后丢弃goroutine? 它保持打印结果显示

回答

2

机会。

语言规范中没有什么说你的“等待出口”应该在“主要出口”之前或之后执行。

如果您运行程序的次数足够多,有时候“主要出口”会先运行。但也可能不是。结果未定义,并取决于运行时状态和实现。这些结果甚至可能会在Go版本之间发生变化。

+0

我已经尝试了很多次,如果这是由机会决定的,我想也许它应该至少出现一次。 –

+1

@JunAn尝试使用-race运行程序。在使用-race编译时,运行时会有点随机化运行goroutines的顺序。使用-race大多数时候我都会得到不同的输出结果。 – nussjustin

+1

@JunAn:订单没有定义,这意味着当前的运行时实现可能仍然会以一致的方式影响订单。如果您使用操场,则每次只检索相同的缓存结果。只要不创建订单就不要依赖订单。 – JimB

相关问题