在 Go 语言中,原子包提供较低级别的原子内存,这有助于实现同步算法。 Go 语言的CompareAndSwapPointer()函数用于对unsafe.Pointer值进行比较和交换操作。这个函数是在 atomic 包下定义的。在这里,您需要导入“sync/atomic”包才能使用这些功能。
句法:
func CompareAndSwapPointer(addr *unsafe.Pointer, old, new unsafe.Pointer) (swapped bool)
这里, addr表示地址, old表示 unsafe.Pointer 值,它是从SwapPointer操作返回的旧交换值, new是unsafe.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。