Go Example--原子计数器

package main

import (
    "fmt"
    "runtime"
    "sync/atomic"
    "time"
)

func main() {
    var ops uint64 = 0
    for i := 0; i < 50; i++ {
        //起50个协程
        go func() {
            for {
                //每个协程对ops变量进行+1操作
                atomic.AddUint64(&ops, 1)
                //协程调度
                runtime.Gosched()
            }
        }()
    }
    //等待1s
    time.Sleep(time.Second)
    //为了在计数器还在被其它 Go 协程更新时,安全的使用它,我们通过 LoadUint64 将当前值的拷贝提取到 opsFinal中。和上面一样,我们需要给这个函数所取值的内存地址 &ops
    opsFinal := atomic.LoadUint64(&ops)
    fmt.Println("ops:", opsFinal)
}

猜你喜欢

转载自www.cnblogs.com/promenader/p/9832280.html
今日推荐