go实现多个goroutine串行执行

实现方式:用map[int]func(uin32)来实现,将要执行的函数放入map中,用map的key来作为实现顺序,由于map取值是无序的,所以需要对用原子操作对goroutine加上自旋锁,使其在没有到达它的执行顺序时进行等待。

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是无序取值,所有更能体现goroutine是顺序执行的
    for index,fn := range m{
        go fn(uint32(index))
    }
    time.Sleep(10*time.Second)
}

func withPrint()operation{
    return func(s string) {
        println(s)
    }
}

//创建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
}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 转载自:https://halfrost.com/go_map_chapter_one/ https://half...
    HuJay阅读 6,194评论 1 5
  • 本文是我自己在秋招复习时的读书笔记,整理的知识点,也是为了防止忘记,尊重劳动成果,转载注明出处哦!如果你也喜欢,那...
    波波波先森阅读 11,334评论 4 56
  • Java8张图 11、字符串不变性 12、equals()方法、hashCode()方法的区别 13、...
    Miley_MOJIE阅读 3,734评论 0 11
  • 一月 0101 跨年 0104 清迈拜佛 0104 清迈飞曼谷 0105 曼谷飞深圳 0106 深圳见面会 010...
    诗与彼方阅读 358评论 0 0
  • 对于很大部分家庭来说,看不起病是很大的难题。一人生病,全家担心。医疗费的高昂,病痛的折磨,都会给我们带来身心的压力...
    是高洁啊阅读 177评论 0 0