實(shí)現(xiàn)方式:用map[int]func(uin32)來實(shí)現(xiàn),將要執(zhí)行的函數(shù)放入map中,用map的key來作為實(shí)現(xiàn)順序,由于map取值是無序的,所以需要對(duì)用原子操作對(duì)goroutine加上自旋鎖,使其在沒有到達(dá)它的執(zhí)行順序時(shí)進(jìn)行等待。
package main
import (
"fmt"
"time"
"sync/atomic"
)
type operation func(string)
func main(){
var count uint32 = 1
m := generate(&count,5,withPrint())
//var i = uint32(0)、
//由于map是無序取值,所有更能體現(xiàn)goroutine是順序執(zhí)行的
for index,fn := range m{
go fn(uint32(index))
}
time.Sleep(10*time.Second)
}
func withPrint()operation{
return func(s string) {
println(s)
}
}
//創(chuàng)建map
func generate(cptr *uint32,total int,op operation)map[int]func(uint32){
var m = make(map[int]func(order uint32),total)
for i:=1;i<=total;i++ {
m[i] = func(order uint32) {
for {
//比較order和count的值是否相等,不想等就自旋
if !atomic.CompareAndSwapUint32(cptr,order,order){
time.Sleep(500*time.Millisecond)
}else {
break
}
}
s := fmt.Sprintf("this is goroutine %d",order)
op(s)
atomic.AddUint32(cptr,1)
}
}
return m
}