MST

星途 面试题库

面试题:Go语言中atomic包如何实现基本类型的原子操作

请简述在Go语言atomic包中,针对int类型的原子增减操作函数有哪些,并且给出一个简单的示例代码,展示如何使用atomic包对int类型变量进行安全的并发增减操作。
28.3万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

针对int类型的原子增减操作函数

  1. AddInt32(addr *int32, delta int32) (new int32):将delta值原子性地加到*addr所指向的int32类型变量上,并返回新的值。
  2. AddInt64(addr *int64, delta int64) (new int64):将delta值原子性地加到*addr所指向的int64类型变量上,并返回新的值。
  3. AddUint32(addr *uint32, delta uint32) (new uint32):将delta值原子性地加到*addr所指向的uint32类型变量上,并返回新的值。
  4. AddUint64(addr *uint64, delta uint64) (new uint64):将delta值原子性地加到*addr所指向的uint64类型变量上,并返回新的值。
  5. AddUintptr(addr *uintptr, delta uintptr) (new uintptr):将delta值原子性地加到*addr所指向的uintptr类型变量上,并返回新的值。

示例代码

package main

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

func main() {
    var counter int64
    var wg sync.WaitGroup

    // 模拟10个并发操作
    for i := 0; i < 10; i++ {
        wg.Add(1)
        go func() {
            defer wg.Done()
            // 原子性增加操作
            atomic.AddInt64(&counter, 1)
        }()
    }

    // 等待所有协程完成
    wg.Wait()

    fmt.Println("Final counter value:", counter)
}

在上述代码中,我们使用atomic.AddInt64函数对int64类型的counter变量进行原子性的增加操作。多个协程并发执行这个增加操作,通过atomic包保证了操作的原子性,避免了竞态条件。最后输出最终的counter值。