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


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


在Go语言中,原子包提供lower-level原子内存,这对实现同步算法很有帮助。 Go语言中的CompareAndSwapUintptr()函数用于对uintptr值执行比较和交换操作。此函数在原子包下定义。在这里,您需要导入“sync/atomic”软件包才能使用这些函数。

用法:

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

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

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

返回值:如果交换完成,则返回true,否则返回false。



范例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的原因。




相关用法


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