MST

星途 面试题库

面试题:Go语言atomic包中用于整数操作的主要原语有哪些及应用场景

请简述Go语言atomic包中用于整数操作的主要内存同步原语(如AddInt32、CompareAndSwapInt64等),并举例说明在并发编程场景下如何使用它们来保证数据的一致性和原子性。
24.9万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

主要内存同步原语

  1. AddInt32:原子性地将delta加到addr指向的int32变量上,并返回新值。用于在并发环境中安全地对int32类型的变量进行加法操作。
  2. AddInt64:类似AddInt32,不过是针对int64类型,原子性地将delta加到addr指向的int64变量上,并返回新值。
  3. CompareAndSwapInt32:比较addr指向的int32变量的值是否等于old,如果相等则将其设置为new,并返回是否成功。用于实现乐观锁等并发控制机制。
  4. CompareAndSwapInt64:与CompareAndSwapInt32类似,针对int64类型。
  5. LoadInt32:原子性地加载addr指向的int32变量的值。在多线程环境下获取int32变量值时保证数据一致性。
  6. LoadInt64:类似LoadInt32,加载int64类型的值。
  7. StoreInt32:原子性地将val值存储到addr指向的int32变量。在多线程环境下设置int32变量值时保证原子性。
  8. StoreInt64:类似StoreInt32,存储int64类型的值。

并发编程场景示例

package main

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

func main() {
    var counter int64
    var wg sync.WaitGroup
    numRoutines := 100

    for i := 0; i < numRoutines; i++ {
        wg.Add(1)
        go func() {
            defer wg.Done()
            // 使用AddInt64原子性地增加counter
            atomic.AddInt64(&counter, 1)
        }()
    }

    wg.Wait()
    fmt.Println("Final counter value:", atomic.LoadInt64(&counter))
}

在上述示例中,通过atomic.AddInt64在多个goroutine中安全地增加counter变量的值,避免了竞态条件,保证了数据的一致性和原子性。使用atomic.LoadInt64来原子性地读取最终的counter值。