Go原子计数
来源:互联网 发布:手机模板源码 编辑:程序博客网 时间:2024/06/05 09:12
发表回复
通过原子计数可以在多线程情况下,对同一个数值进行加减操作,一般用于状态同步。
先看代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
package main
import "fmt"
import "time"
import "sync/atomic"
import "runtime"
func main() {
// 定义一个整数
var ops uint64 = 0
// 使用50个线程给ops累加数值
for i := 0; i < 50; i++ {
go func() {
for {
// 每次加1
atomic.AddUint64(&ops,1)
// 这个函数用于时间片切换
//可以理解为高级版的time.Sleep()
//避免前面的for循环将CPU时间片都卡在一个线程里,使得其它线程没有执行机会
runtime.Gosched()
}
}()
}
//停一秒,上面50个线程有1秒的执行时间
time.Sleep(time.Second)
// 获取结果
opsFinal := atomic.LoadUint64(&ops)
fmt.Println("ops:", opsFinal)
}
import "fmt"
import "time"
import "sync/atomic"
import "runtime"
func main() {
// 定义一个整数
var ops uint64 = 0
// 使用50个线程给ops累加数值
for i := 0; i < 50; i++ {
go func() {
for {
// 每次加1
atomic.AddUint64(&ops,1)
// 这个函数用于时间片切换
//可以理解为高级版的time.Sleep()
//避免前面的for循环将CPU时间片都卡在一个线程里,使得其它线程没有执行机会
runtime.Gosched()
}
}()
}
//停一秒,上面50个线程有1秒的执行时间
time.Sleep(time.Second)
// 获取结果
opsFinal := atomic.LoadUint64(&ops)
fmt.Println("ops:", opsFinal)
}
打印结果类似:
ops: 40200
如果不使用原子计数,直接使用ops =ops+1会导致多线程时计数不准确。
打开Go源码中的atomic包,可以看到相关算法都是用汇编语言写的。所以原子计数执行效率非常高。
文章导航
日志分类
- go语言 (76)
- swift (10)
- webos开发 (8)
- 乱七八糟 (59)
- 程序设计 (170)
- 网站制作 (72)
最新文章
- 记一次诡异的win10 “丢失”文件事件
- 企业微信 查不到该手机号的所属企业 的解决办法
- gradle学习总结
- 关于swift中的强引用 弱引用 无主引用
- 连接aws ec2提示Operation timed out的解决办法
近期评论
- 发表在《仿twitter的开源微型博客系统》
- 发表在《仿twitter的开源微型博客系统》
- 发表在《仿twitter的开源微型博客系统》
- 发表在《仿twitter的开源微型博客系统》
- 发表在《仿twitter的开源微型博客系统》
日志索引
0 0
- Go原子计数
- 原子计数【转】
- Go编写计数排序
- Go语言atomic原子操作
- 集群环境中利用Memcached CAS原子操作计数
- Linus:为何对象引用计数必须是原子的
- Java 并发包之线程池和原子计数
- 原子
- win32的计数增减操作的原子操作--InterLockedIncrement和InterlockedDecrement
- 多线程无锁编程--原子计数操作:__sync_fetch_and_add等12个操作
- 【并行计算】Linus:为何对象引用计数必须是原子的
- 【Linux】多线程无锁编程--原子计数操作:__sync_fetch_and_add等12个操作
- 计数
- 计数
- 计数
- 计数
- 计数
- 计数
- LeetCode练习-难题卷
- 我的ubuntu问题汇总
- 从nsq中学习如何优雅的退出go 网络程序
- [阶段二]Android UI窗口组件
- Deepin logo国内 Linux 发行版 Deepin
- Go原子计数
- spring加载--从xml配置文件到内存
- Ubuntu软件安装
- Docker快速入门
- [CORS:跨域资源共享] ASP.NET Web API自身对CORS的支持: CORS授权检验的实施
- [阶段二]Android UI列表组件
- 森林_ssl1703_dfs+凸包
- HTML <base> 标签
- C#之WinForm基础 主窗体在哪里可以看到,如何更改主窗体,主窗体有什么特殊的地方