036_go语言中的原子计数器
2024-10-09 10:44:40
代码演示
package main import (
"fmt"
"runtime"
"sync/atomic"
"time"
) func main() {
var ops uint64 = 0
for i := 0; i < 50; i++ {
go func() {
for {
atomic.AddUint64(&ops, 1)
runtime.Gosched()
}
}()
}
time.Sleep(time.Second)
opsFinal := atomic.LoadUint64(&ops)
fmt.Println("ops:", opsFinal)
}
代码运行结果
ops: 7838509
代码解读
- go语言中最主要的状态管理方式是通过通道间的沟通完成的,本例子中,我们用sync/atomic包在多个go协程中进行原子计数
- 先定义一个ops为无符号整形(永远是正整数),然后启动50个协程,对计数器每隔一定时间进行加一的操作
- 使用&来读取ops的内存地址,这样可以修改原来的值,不会拷贝新值
- runtime.Gosched()的作用是,可以由其它的协程继续执行。比如第一个协程for循环执行到这里,由第二个协程可以接力过来继续执行
- 最后等待1秒钟,留给协程足够的时间执行,最终读取了计数器的值
最新文章
- c# 调用 matlab
- 【AT91SAM3S】SAM3S-EK Demo工程中,LCD驱动程序的加载(函数指针结构体)
- json转换为javabean
- Light OJ 1019 - Brush (V)(图论-dijkstra)
- 利用matlab编写实现显示fmri切片slice图像 混合显示 不同侧面显示 可叠加t检验图显示 by DR. Rajeev Raizada
- 【HDOJ】4057 Rescue the Rabbit
- lucene4.6 索引创建和搜索例子
- 6. java.lang.IllegalArgumentException
- CentOS 6.4 文件夹打开方式
- 微信小程序开源项目库集合
- opencv鼠标操作及GUI矩形绘画
- nmap简介和使用
- spring websocket报错:No matching message handler methods.
- 7-安装Spark
- S5PV210 串口配置与实验(轮询方式)
- 在HashTable上下文中,同步指的是什么?
- 利用matlab写一个简单的拉普拉斯变换提取图像边缘
- 【Android】Handler详解
- ssh&;scp指定密钥
- 安装PHP扩展-----phpredis