📅  最后修改于: 2023-12-03 15:01:01.412000             🧑  作者: Mango
在 Golang 中,atomic 包提供了一系列原子操作函数,用于实现并发安全。
其中,atomic.SwapUintptr() 函数用于原子地交换 uintptr 类型的值。
func SwapUintptr(addr *uintptr, new uintptr) (old uintptr)
SwapUintptr()
函数用于原子地交换 addr
指向的 uintptr 类型的值为 new
,并返回交换前的旧值。
package main
import (
"fmt"
"sync/atomic"
)
func main() {
var val1 uintptr = 1
var val2 uintptr = 2
// 使用 SwapUintptr() 函数交换 val1 和 val2 的值
oldVal := atomic.SwapUintptr(&val1, val2)
fmt.Println("val1 =", val1, ", val2 =", val2, ", oldVal =", oldVal)
}
运行该示例代码,输出结果为:
val1 = 2 , val2 = 2 , oldVal = 1
在上述代码中,首先定义了两个 uintptr 类型的变量 val1
和 val2
,分别赋初值为 1 和 2,然后调用 SwapUintptr()
函数交换它们的值,并将交换前的旧值保存在 oldVal
中。
最终输出结果表明,val1 的值已经被修改为 2,而 val2 的值始终为 2,同时也输出了交换前的旧值为 1。
需要注意的是,SwapUintptr()
函数对应的指针类型参数必须是 uintptr 类型的指针。
而且,使用 SwapUintptr()
函数进行原子操作时,不应同时对同一变量进行其他类型的非原子操作,否则可能会出现意料之外的结果。