Función atomic.CompareAndSwapPointer() en Golang con ejemplos

En el lenguaje Go, los paquetes atómicos proporcionan una memoria atómica de nivel inferior que es útil para implementar algoritmos de sincronización. La función CompareAndSwapPointer() en el lenguaje Go se usa para realizar la operación de comparación e intercambio para un valor de puntero no seguro . Esta función se define en el paquete atómico. Aquí, debe importar el paquete «sync/atomic» para usar estas funciones.

Sintaxis:

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

Aquí, addr indica la dirección, old indica unsafe.Pointer value que es el valor intercambiado anterior que se devuelve de la operación SwapPointer , y new es el valor nuevo de unsafe.Pointer que se intercambiará a sí mismo del valor intercambiado anterior.

Nota: (*unsafe.Pointer) es el puntero a un valor de unsafe.Pointer . Y unsafe.Pointer type es útil para permitir transiciones entre tipos arbitrarios y el tipo uintptr integrado . Además, unsafe es un paquete que es útil en la seguridad de tipo de los programas Go.

Valor devuelto: Devuelve verdadero si se logra el intercambio; de lo contrario, devuelve falso.

Ejemplo 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)
}

Producción:

true

Ejemplo 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)
}

Producción:

false

En el ejemplo anterior, el intercambio no se realiza ya que el valor anterior aquí en el método CompareAndSwapPointer() debe ser el valor devuelto por el método SwapPointer() pero aquí el valor anterior es diferente, por lo que se devuelve false desde el código anterior.

Publicación traducida automáticamente

Artículo escrito por nidhi1352singh y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *