golang 在多线程中避免 CPU 指令重排
在 Go 语言中,可以使用 sync/atomic
包的函数来避免 CPU 指令重排,这个包提供了原子级别的读写操作,可以确保内存的可见性和顺序性。
以下是一个简单的示例,展示如何使用 sync/atomic
包来避免 CPU 指令重排:
package main
import (
"fmt"
"sync"
"sync/atomic"
)
func main() {
var counter int32
var wg sync.WaitGroup
wg.Add(2)
// 开启两个并发的 goroutines
go func() {
defer wg.Done()
for i := 0; i < 2; i++ {
atomic.AddInt32(&counter, 1) // 原子性地增加 counter
}
}()
go func() {
defer wg.Done()
for i := 0; i < 2; i++ {
atomic.AddInt32(&counter, 1) // 原子性地增加 counter
}
}()
wg.Wait() // 等待两个 goroutines 完成
// 输出 counter 的最终值,应该为 4,因为有两个 goroutines 各自增加了 2 次
fmt.Println("Counter value:", counter)
}
在这个例子中,我们使用了 sync/atomic
包中的 AddInt32
函数来原子性地增加 counter 变量的值。这样,即使在多线程环境下,也能确保 counter 的值是正确的,不会出现因为 CPU 指令重排而导致的问题。
评论已关闭