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