MST

星途 面试题库

面试题:Go语言中atomic.Store和Load函数在并发场景的应用

请描述在一个多协程读写共享变量的场景中,如何使用atomic.Store和atomic.Load函数来保证数据的一致性,并给出一个简单的代码示例。
32.5万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

在多协程读写共享变量的场景中,atomic.Storeatomic.Load 函数用于保证数据一致性。atomic.Store 用于安全地存储值到共享变量,atomic.Load 用于安全地从共享变量读取值。这两个函数通过底层硬件指令确保操作的原子性,避免竞态条件。

以下是一个简单的Go语言代码示例:

package main

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

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

    // 启动10个协程进行写操作
    for i := 0; i < 10; i++ {
        wg.Add(1)
        go func(id int) {
            defer wg.Done()
            value := int64(id * 10)
            atomic.StoreInt64(&sharedVar, value)
            fmt.Printf("协程 %d 存储值: %d\n", id, value)
        }(i)
    }

    // 启动10个协程进行读操作
    for i := 0; i < 10; i++ {
        wg.Add(1)
        go func(id int) {
            defer wg.Done()
            value := atomic.LoadInt64(&sharedVar)
            fmt.Printf("协程 %d 读取值: %d\n", id, value)
        }(i)
    }

    wg.Wait()
}

在这个示例中:

  1. atomic.StoreInt64 函数用于将值安全地存储到 sharedVar 中。
  2. atomic.LoadInt64 函数用于安全地从 sharedVar 读取值。
  3. sync.WaitGroup 用于等待所有协程完成操作,确保程序不会提前退出。

这样通过 atomic.Storeatomic.Load 函数,在多协程环境中保证了共享变量 sharedVar 的数据一致性。