您的位置:首页 > 编程语言 > Go语言

Go原子计数

2016-09-17 08:25 204 查看
发表回复

通过原子计数可以在多线程情况下,对同一个数值进行加减操作,一般用于状态同步。

先看代码:

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

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)
}
打印结果类似:

ops: 40200

如果不使用原子计数,直接使用ops =ops+1会导致多线程时计数不准确。

打开Go源码中的atomic包,可以看到相关算法都是用汇编语言写的。所以原子计数执行效率非常高。

本条目发布于2015年10月6日。属于go语言分类。作者是baiyuxiong

文章导航

← 早期文章
较新文章


搜索本站文章

搜索:

日志分类

go语言 (76)
swift (10)
webos开发 (8)
乱七八糟 (59)
程序设计 (170)
网站制作 (72)

最新文章

记一次诡异的win10 “丢失”文件事件
企业微信 查不到该手机号的所属企业 的解决办法
gradle学习总结
关于swift中的强引用 弱引用 无主引用
连接aws ec2提示Operation timed out的解决办法

近期评论

捕鱼器发表在《仿twitter的开源微型博客系统
电子捕鱼器发表在《仿twitter的开源微型博客系统
捕鱼机发表在《仿twitter的开源微型博客系统
电鱼机发表在《仿twitter的开源微型博客系统
捕鱼器发表在《仿twitter的开源微型博客系统

日志索引

日志索引

链接表

IMCN-我是菜鸟
中式装修
中式装修效果图
代码疯子
寺院装修
果壳博客

Meta

登录
文章RSS
评论RSS
WordPress.org
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: