2017-06-20 21 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

相關問題