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

📅  最后修改于: 2021-10-25 02:15:57             🧑  作者: Mango

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

句法:

func CompareAndSwapUintptr(addr *uintptr, old, new uintptr) (swapped bool)

这里, addr表示地址, old表示旧的uintptr 值, new是 uintptr 的新值,它将与旧值交换存储在 addr 中。

注意: (*uintptr) 是指向 uintptr 值的指针。 uintptr是一个无符号整数类型,它太大并且包含任何指针的位模式。

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

示例 1:

// Program to illustrate the usage of
// CompareAndSwapUintptr function in Golang
  
// Including main package
package main
  
// importing fmt and sync/atomic
import (
    "fmt"
    "sync/atomic"
)
  
// Main function
func main() {
  
    // Assigning variable
    // values to the uintptr
    var (
        i uintptr = 34764686
        j uintptr = 41343432525245
        k uintptr = 0
    )
  
    // Calling CompareAndSwapUintptr 
    // method with its parameters
    Swap1 := atomic.CompareAndSwapUintptr(&i,
                         34764686, 647567565)
      
    Swap2 := atomic.CompareAndSwapUintptr(&j,
                          41343432525245, 76)
      
    Swap3 := atomic.CompareAndSwapUintptr(&k,
                                       0, 15)
  
    // Displays true if 
    // swapped else false
    fmt.Println(Swap1)
    fmt.Println(Swap2)
    fmt.Println(Swap3)
  
    // Prints addr
    fmt.Println(i)
    fmt.Println(j)
    fmt.Println(k)
}

输出:

true
true
true
647567565
76
15

示例 2:

// Program to illustrate the usage of
// CompareAndSwapUintptr function in Golang
  
// Including main package
package main
  
// Importing fmt and sync/atomic
import (
    "fmt"
    "sync/atomic"
)
  
// Main function
func main() {
  
    // Assigning variable 
    // values to the uintptr
    var (
        x uintptr = 56466244
    )
  
    // Swapping operation
    var oldvalue = atomic.SwapUintptr(&x, 2344444)
  
    // Printing old value 
    // and swapped value
    fmt.Println("Swapped_value:", x,
            ", old_value:", oldvalue)
  
    // Calling CompareAndSwapUintptr 
    // method with its parameters
    Swap := atomic.CompareAndSwapUintptr(&x,
                         56466244, 13232324)
  
    // Displays true if 
    // swapped else false
    fmt.Println(Swap)
    fmt.Println(x)
}

输出:

Swapped_value: 2344444, old_value: 56466244
false
2344444

这里,从交换操作中获得的交换值必须是 CompareAndSwapUintptr() 方法的旧值,但这里采用的旧值是交换操作的旧值,这是不正确的,这就是返回 false 的原因。