golang 併發順序輸出數字
阿新 • • 發佈:2019-01-09
package main import ( "fmt" "sync/atomic" "time" ) func main() { var count uint32 trigger := func(i uint32, fn func()) { for { if n := atomic.LoadUint32(&count); n == i { fn() atomic.AddUint32(&count, 1) break } time.Sleep(time.Nanosecond) } } for i := uint32(0); i < 10; i++ { go func(i uint32) { fn := func() { fmt.Println(i) } trigger(i, fn) }(i) } trigger(10, func() {}) }
踩坑點
- golang併發時,go程式需要有啟動延時,需要讓main函式休眠,才能讓goroutine程式在main函式退出前有機會執行完畢
- goroutinue程式的啟動和for迴圈執行完畢是同時的,想上述程式碼,一般情況下gorountine開始執行時,for迴圈已經結束,因此i是10了。因此需要把i通過閉包封到goroutinue裡去
- goroutine是隨機的,需要控制。