返回
北京兄弟连IT
置顶
该校与厚学网暂未合作,平台不保证课程的真实有效性,如有侵权等争议,请及时与厚学网联系处理
招生热线:400-656-1390

学校地址:北京市昌平区回龙观文华西路育荣教育园区兄弟连IT教育

兄弟连Go语言培训GO案例​原子计数器

88 2018-08-01 10:40:00

学习笔记

  兄弟连Go语言培训课程体系设计架构包括了区块链的基础语言Go语言、区块链后端技术体系、区块链公链、区块链分布式应用开发等内容讲解,以及到最后的面试指导和项目实战。课程由清华微软谷歌团队精心打造,历时半年时间共同研发而出。

  兄弟连Go语言培训清华尹成带你实战GO案例(63)Go原子计数器

  Go原子计数器

  Go里面的管理协程状态的主要机制就是通道通讯。这些我们上面的例子介绍过。这里还有一些管理状态的

  机制,下面我们看看多协程原子访问计数器的例子,这个功能是由sync/atomic包提供的函数来实现的。

  packagemain

  import"fmt"

  import"time"

  import"sync/atomic"

  import"runtime"

  funcmain(){

  //我们使用一个无符号整型来代表一个永远为正整数的counter

  varopsuint64=0

  //为了模拟并行更新,我们使用50个协程来每隔1毫秒来

  //增加一下counter值,注意这里的50协程里面的for循环,

  //也就是说如果主协程不退出,这些协程将永远运行下去

  //所以这个程序每次输出的值有可能不一样

  fori:=0;i<50;i++{

  gofunc(){

  for{

  //为了能够保证counter值增加的原子性,我们使用

  //atomic包中的AddUint64方法,将counter的地址和

  //需要增加的值传递给函数即可

  atomic.AddUint64(&ops,1)

  //允许其他的协程来处理

  runtime.Gosched()

  }

  }()

  }

  //等待1秒中,让协程有时间运行一段时间

  time.Sleep(time.Second)

  //为了能够在counter仍被其他协程更新值的同时安全访问counter值,

  //我们获取一个当前counter值的拷贝,这里就是opsFinal,需要把

  //ops的地址传递给函数`LoadUint64`

  opsFinal:=atomic.LoadUint64(&ops)

  fmt.Println("ops:",opsFinal)

  }

  我们多运行几次,结果如下:

  ops:7499289

  ops:7700843

  ops:7342417

  

文中图片素材来源网络,如有侵权请联系删除
来源:北京兄弟连IT
热门课程 全部课程

热门动态

申请免费试听

只要一个电话

我们为您免费回电

立即申请