golang 並發順序輸出數字
阿新 • • 發佈:2019-01-09
trigge per 執行 == 函數 goroutin trigger 輸出 cond
參考
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是隨機的,需要控制。
golang 並發順序輸出數字