MST

星途 面试题库

面试题:Go语言中atomic.Add系列函数在并发场景下如何保证数据一致性

在Go语言中,假设有多个协程同时对一个整型变量进行累加操作,使用atomic.AddInt64函数来实现。请描述该函数是如何保证数据一致性的,并且编写一段简单代码示例展示其使用方法。
31.2万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

1. atomic.AddInt64 保证数据一致性的原理

atomic.AddInt64 函数通过底层硬件提供的原子操作指令来保证数据一致性。在多核处理器环境下,这些原子操作指令能够确保在对共享变量进行操作时,不会受到其他处理器核心同时操作的干扰,从而避免数据竞争问题。它在硬件层面保证了操作的原子性,即要么操作全部完成,要么操作没有发生,不会出现部分操作完成的中间状态。

2. 代码示例

package main

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

func main() {
    var num int64
    var wg sync.WaitGroup
    const numRoutines = 10

    for i := 0; i < numRoutines; i++ {
        wg.Add(1)
        go func() {
            defer wg.Done()
            for j := 0; j < 1000; j++ {
                atomic.AddInt64(&num, 1)
            }
        }()
    }

    wg.Wait()
    fmt.Println("Final value of num:", num)
}

在上述代码中,定义了一个 int64 类型的共享变量 num。通过启动 numRoutines 个协程,每个协程对 num 进行 1000 次累加操作。atomic.AddInt64 函数确保了在多协程并发操作 num 时数据的一致性,最终输出的 num 值为正确的累加结果。