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

📅  最后修改于: 2021-10-24 13:29:26             🧑  作者: Mango

在 Go 语言中,原子包提供较低级别的原子内存,这有助于实现同步算法。 Go 语言的CompareAndSwapPointer()函数用于对unsafe.Pointer值进行比较和交换操作。这个函数是在 atomic 包下定义的。在这里,您需要导入“sync/atomic”包才能使用这些功能。

句法:

func CompareAndSwapPointer(addr *unsafe.Pointer, old, new unsafe.Pointer) (swapped bool)

这里, addr表示地址, old表示 unsafe.Pointer 值,它是从SwapPointer操作返回的旧交换值, newunsafe.Pointer新值,它将与旧交换值交换自身。

注意: (*unsafe.Pointer) 是指向unsafe.Pointer值的指针。 unsafe.Pointer类型有助于实现任意类型和内置uintptr类型之间的转换。此外,unsafe 是一个有助于 Go 程序类型安全的包。

返回值:如果交换完成则返回真,否则返回假。

示例 1:

// Program to illustrate the usage of
// CompareAndSwapPointer function in Golang
  
// Including main package
package main
  
// Importing fmt, 
// sync/atomic and unsafe
import (
    "fmt"
    "sync/atomic"
    "unsafe"
)
  
// Defining a struct type P
type P struct{ x, y, z int }
  
// Declaring pointer 
// to P struct type
var pP *P
  
// Main function
func main() {
  
    // Defining addr unsafe.Pointer
    var unsafe1 = (*unsafe.Pointer)(unsafe.Pointer(&pP))
  
    // Old unsafe pointer
    var sy P
  
    // Defining new unasfe.pointer
    px := atomic.SwapPointer(
        unsafe1, unsafe.Pointer(&sy))
  
    // Calling CompareAndSwapPointer 
    // method with its parameters
    y := atomic.CompareAndSwapPointer(
        unsafe1, unsafe.Pointer(&sy), px)
  
    // Returns true if 
    // swapped else false
    fmt.Println(y)
}

输出:

true

示例 2:

// Program to illustrate the usage of
// CompareAndSwapPointer function in Golang
  
// Including main package
package main
  
// importing fmt, 
// sync/atomic and unsafe
import (
    "fmt"
    "sync/atomic"
    "unsafe"
)
  
// Defining a struct type P
type P struct{ x, y, z int }
  
// Declaring pointer to P struct type
var pP *P
  
// Main function
func main() {
  
    // Defining addr unsafe.Pointer
    var unsafe1 = (*unsafe.Pointer)(unsafe.Pointer(&pP))
  
    // Old unsafe pointer
    var sy P
  
    // Defining new unasfe.pointer
    px := atomic.SwapPointer(
        unsafe1, unsafe.Pointer(&sy))
  
    // Calling CompareAndSwapPointer
    // method with its parameters
    y := atomic.CompareAndSwapPointer(
        unsafe1, px, unsafe.Pointer(&sy))
  
    // Returns true if 
    // swapped else false
    fmt.Println(y)
}

输出:

false

在上面的例子中,没有执行交换,因为这里CompareAndSwapPointer() 方法中的旧值必须是从SwapPointer() 方法返回的值,但这里旧值不同,因此上述代码返回 false。