📌  相关文章
📜  Golang 中的 atomic.CompareAndSwapUintptr()函数示例(1)

📅  最后修改于: 2023-12-03 15:31:01.167000             🧑  作者: Mango

Golang 中的 atomic.CompareAndSwapUintptr()函数

在 Golang 中,atomic 包提供了一组原子操作函数,用于实现并发安全的程序。其中一个原子操作函数是 CompareAndSwapUintptr,它的作用是比较并交换一个 uintptr 类型的值。

函数签名
func CompareAndSwapUintptr(addr *uintptr, old, new uintptr) (swapped bool)
使用方法

CompareAndSwapUintptr 函数接收三个参数:

  • addr:指向要比较并交换的变量的指针。
  • old:期望的值。
  • new:新值。

如果 addr 指向的值等于 old,则将其修改为 new,并返回 true;否则不做任何操作,返回 false

下面是一个示例程序,用来演示 CompareAndSwapUintptr 函数的使用:

package main

import (
	"fmt"
	"sync/atomic"
)

func main() {
	var value uintptr = 42
	addr := &value

	// 期望的值为 42,新值为 100
	if atomic.CompareAndSwapUintptr(addr, 42, 100) {
		fmt.Println("比较并交换成功,现在的值为", *addr)
	} else {
		fmt.Println("比较并交换失败,现在的值为", *addr)
	}

	// 期望的值为 50,新值为 200
	if atomic.CompareAndSwapUintptr(addr, 50, 200) {
		fmt.Println("比较并交换成功,现在的值为", *addr)
	} else {
		fmt.Println("比较并交换失败,现在的值为", *addr)
	}
}

输出结果如下:

比较并交换成功,现在的值为 100
比较并交换失败,现在的值为 100
注意事项
  • addr 必须是 uintptr 类型的指针。
  • oldnew 也必须是 uintptr 类型。
  • CompareAndSwapUintptr 函数保证原子性,因此不需要加锁保护。
  • 如果多个 goroutine 同时调用 CompareAndSwapUintptr 函数,保证最终结果是正确的,但是执行次数会增加,可能会影响性能。