golang多协程顺序打印数字

思路: 利用原子性操作,实现一个自旋锁.实现多协程顺序打印数字

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

//原子操作的变量.
var Count int32
//实现一个自旋锁操作.
func SpinLock(i int32, fn func()) {
    for { //一个死循环.
        //查看原子操作的值.如果相等则执行函数
        if n := atomic.LoadInt32(&Count); n == i {
            fn()
            atomic.AddInt32(&Count, 1) //然后原子操作自增.
            break //一定要跳出循环.
        }
        time.Sleep(time.Nanosecond)
    }
}
func main() {
    for i := int32(0); i < 10; i ++ {
        go func(i int32) {
            fn := func() {
                fmt.Println(i)
            }
            SpinLock(i, fn)
        }(i)
    }
       //当原子操作自增count = 10就结束操作, 也可以睡一会儿
    SpinLock(10, func() {})
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 我是在深入学习 kotlin 时第一次看到协程,作为传统线程模型的进化版,虽说协程这个概念几十年前就有了,但是协程...
    前行的乌龟阅读 100,030评论 32 182
  • 1. 前言 在执行一些 IO 密集型任务的时候,程序常常会因为等待 IO 而阻塞。比如在网络爬虫中,如果我们使用 ...
    NewForMe阅读 409评论 0 1
  • 你的第一个协程 输出结果 从本质上讲,协同程序是轻量级的线程。它们是与发布 协同程序构建器一起启动的。您可以实现相...
    十方天仪君阅读 2,548评论 0 2
  • 今天姥姥回家了,妈妈下班后白白来找妈妈,在中心玩了一会,跟柴宝姐姐一起回家!小孩现在真是到了认生期了,谁也不行就找...
    大白嫲嫲阅读 189评论 0 0
  • 这是一篇骂街文,说说我与简书的故事。 4月份注册的,发文后不怎么理想,也可能是我不太懂简书的机制。因为不懂,所以效...
    朱炳宇阅读 500评论 7 9