zoukankan      html  css  js  c++  java
  • Go原子计数

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

    先看代码:

    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包,可以看到相关算法都是用汇编语言写的。所以原子计数执行效率非常高。

  • 相关阅读:
    线段树模板
    树状数组练习
    树状数组模板
    codeforce——思维dp
    fib博弈
    寒假总结
    相邻的数互质
    大数取模运算
    阶乘因式分解(一)
    1和0既非素数也非合数
  • 原文地址:https://www.cnblogs.com/baiyuxiong/p/4312708.html
Copyright © 2011-2022 走看看