首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Go程序例子(43):原子计数器

Go程序例子(43):原子计数器

原创
作者头像
用户11078756
发布2024-12-18 10:44:59
发布2024-12-18 10:44:59
1680
举报
文章被收录于专栏:go程序例子go程序例子

Go 中管理状态的主要机制是通过通道进行通信。例如,我们在 worker 池中就看到了这一点。不过,还有一些其他选项来管理状态。在这里,我们将介绍如何使用 sync/atomic 包来管理多个 goroutines 访问的原子计数器。

代码语言:go
复制
package main

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

func main() {
	// 我们将使用原子整数类型来表示我们的(始终为正的)计数器。
    var ops atomic.Uint64
	// WaitGroup 将帮助我们等待所有 goroutines 完成它们的工作。
    var wg sync.WaitGroup
	// 我们将启动 50 个 goroutines,每个 goroutine 都会将计数器递增 1000 次。
    for i := 0; i < 50; i++ {
        wg.Add(1)

        go func() {
            for c := 0; c < 1000; c++ {
				// 为了原子性地递增计数器,我们使用 Add。
                ops.Add(1)
            }

            wg.Done()
        }()
    }
	// 等待所有 goroutines 完成。
    wg.Wait()

    fmt.Println("ops:", ops.Load())
}

在这里,没有 goroutines 在写入 ops,但通过使用 Load,即使其他 goroutines 正在(原子地)更新它,读取值也是安全的。

代码语言:javascript
复制
$ go run atomic-counters.go
ops: 50000

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档