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

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

Golang 中的 atomic.StoreUintptr() 函数示例

在 Go 语言中,atomic 包提供了一组原子操作函数,用于实现线程安全的并发编程。其中之一就是 atomic.StoreUintptr() 函数,用于原子性地将一个指针保存到 uintptr 类型的变量中。

函数签名
func StoreUintptr(addr *uintptr, val uintptr)

参数列表:

  • addr:一个指向 uintptr 类型变量的指针。
  • val:需要保存的 uintptr 类型的值。
功能

atomic.StoreUintptr() 函数用于将一个 uintptr 类型的值原子性地保存到指定的地址中。该函数保证对该地址的访问是原子的,不会被其他并发操作所干扰。

示例

下面是一个示例代码片段,展示了如何使用 atomic.StoreUintptr() 函数:

package main

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

func main() {
	var wg sync.WaitGroup

	var addr uintptr
	var val uintptr = 42

	wg.Add(2)

	// 子 goroutine 中原子性地存储 uintptr 值
	go func() {
		atomic.StoreUintptr(&addr, val)
		wg.Done()
	}()

	// 主 goroutine 中读取存储的 uintptr 值
	go func() {
		// 等待子 goroutine 完成
		wg.Wait()

		result := atomic.LoadUintptr(&addr)
		fmt.Println("Stored uintptr:", result)
	}()

	wg.Wait()
}

在上述示例中,我们创建了两个 goroutine,一个用于调用 atomic.StoreUintptr() 函数将 val 存储到 addr 变量中,另一个 goroutine 则使用 atomic.LoadUintptr() 函数读取该存储的值并打印出来。使用 sync.WaitGroup 来等待所有 goroutine 完成。

注意事项
  • atomic.StoreUintptr() 函数只能用于保存 uintptr 类型的值,不能保存其他类型。
  • atomic.StoreUintptr() 函数保证对指定地址的访问是原子的,但对于指针指向的值的修改并不保证是原子的。
  • 在使用 atomic.StoreUintptr() 时,需要保证被存储的值和地址是有效的。
  • atomic.StoreUintptr() 函数在性能上可能比常规的变量赋值操作略慢,因为它需要保证操作的原子性。

更多关于 atomic 包中其他原子操作函数的使用示例,请参考 Go 官方文档