当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Golang atomic.SwapPointer()用法及代码示例


在Go语言中,原子包提供lower-level原子内存,这对实现同步算法很有帮助。 Go语言中的SwapPointer()函数用于将新值自动存储到* addr中,并返回先前的* addr值。此函数在原子包下定义。在这里,您需要导入“sync/atomic”软件包才能使用这些函数。

用法:

func SwapPointer(addr *unsafe.Pointer, new unsafe.Pointer) (old unsafe.Pointer)

在此,addr表示地址。而new是新的unsafe.Pointer值,而old是旧的unsafe.Pointer值。

注意:(* unsafe.Pointer)是指向unsafe.Pointer值的指针。而且unsafe.Pointer类型有助于启用任意类型和内置uintptr类型之间的转换。此外,不安全是有助于Go程序的类型安全的软件包。

返回值:它将新的unsafe.Pointer值存储到* addr中,并返回先前的* addr值。



范例1:

// Program to illustrate the usage of 
// SwapPointer function in Golang 
  
// Including main package 
package main 
  
// Importing fmt and sync/atomic 
import ( 
    "fmt"
    "sync/atomic"
    "unsafe"
) 
  
// Defining a struct type L 
type L struct{ x, y, z int } 
  
// Declaring pointer to L struct type 
var PL *L 
  
// Main function 
func main() { 
  
    // Defining *addr unsafe.Pointer 
    var unsafepL = (*unsafe.Pointer)(unsafe.Pointer(&PL)) 
  
    // Defining values  
    // of unsafe.Pointer 
    var px, py L 
  
    // Storing value to the pointer 
    atomic.StorePointer( 
        unsafepL, unsafe.Pointer(&px)) 
  
    // Calling SwapPointer() method 
    px1:= atomic.SwapPointer(unsafepL, 
                  unsafe.Pointer(&py)) 
  
    // Returns true if swapped 
    fmt.Println((*L)(px1) == &px) 
  
    // Prints output 
    fmt.Println(px1) 
}

输出:

true
0xc0000c2000  // Can be different at different run times

在这里,StorePointer方法将值添加到* addr,然后SwapPointer方法将新值自动存储到* addr中并返回旧值。并且,在此完成交换,因此返回true,并且不安全的值。此处返回的Pointer在不同的运行时间可能会有所不同。

范例2:

// Program to illustrate the usage of 
// SwapPointer function in Golang 
  
// Including main package 
package main 
  
// Importing fmt and sync/atomic 
import ( 
    "fmt"
    "sync/atomic"
    "unsafe"
) 
  
// Defining a struct type L 
type L struct{ x, y, z int } 
  
// Declaring pointer 
// to L struct type 
var PL *L 
  
// Main function 
func main() { 
  
    // Defining *addr unsafe.Pointer 
    var unsafepL = (*unsafe.Pointer)(unsafe.Pointer(&PL)) 
  
    // Defining values of unsafe.Pointer 
    var px, py L 
  
    // Calling SwapPointer() method 
    px1:= atomic.SwapPointer(unsafepL, 
                  unsafe.Pointer(&py)) 
  
    // Returns true if swapped 
    fmt.Println((*L)(px1) == &px) 
  
    // Prints output 
    fmt.Println(&px1) 
}

输出:

false
0xc00000e028  // Can be different at different run times

此处,返回false,因为在此之前不存储unsafe.pointer,因此SwapPointer()方法无法交换指定的值。此外,此处返回的地址值是px1的地址,而px1的值将为零,因为未执行交换。




相关用法


注:本文由纯净天空筛选整理自nidhi1352singh大神的英文原创作品 atomic.SwapPointer() Function in Golang With Examples。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。