golang 並發順序輸出數字


參考

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() {})
}

踩坑點

  1. golang並發時,go程序需要有啟動延時,需要讓main函數休眠,才能讓goroutine程序在main函數退出前有機會運行完畢
  2. goroutinue程序的啟動和for循環執行完畢是同時的,想上述代碼,一般情況下gorountine開始執行時,for循環已經結束,因此i是10了。因此需要把i通過閉包封到goroutinue里去
  3. goroutine是隨機的,需要控制。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM