面试题答案
一键面试针对int类型的原子增减操作函数
AddInt32(addr *int32, delta int32) (new int32)
:将delta
值原子性地加到*addr
所指向的int32
类型变量上,并返回新的值。AddInt64(addr *int64, delta int64) (new int64)
:将delta
值原子性地加到*addr
所指向的int64
类型变量上,并返回新的值。AddUint32(addr *uint32, delta uint32) (new uint32)
:将delta
值原子性地加到*addr
所指向的uint32
类型变量上,并返回新的值。AddUint64(addr *uint64, delta uint64) (new uint64)
:将delta
值原子性地加到*addr
所指向的uint64
类型变量上,并返回新的值。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
值。