Golang多个goroutine顺序输出自然数序列

package main

import (
	"sync/atomic"
	"time"
	"fmt"
)

func main() {
	var number uint32 = 10
	//count相当于一个接力棒
	var count uint32
	trigger := func(i uint32, fn func()) {
		//自旋锁
		for {
			if n := atomic.LoadUint32(&count); n == i {
				fn()
				//一定要在执行完函数后才原子加1
				atomic.AddUint32(&count, 1)
				break
			}
			time.Sleep( 1 * time.Millisecond)
		}
	}

	for i := uint32(0); i < number; i++ {
		go func(i uint32) {
			fn := func() {
				fmt.Println(i)
			}
			trigger(i, fn)
		}(i)
	}
	trigger(number, func(){})
	//会按照自然数顺序打印(一定是这样)
}

猜你喜欢

转载自blog.csdn.net/u010129985/article/details/83587858