Attribution atomique de pointeurs dans Go
Go fournit une variété d'outils pour gérer la concurrence, mais une question qui se pose souvent est de savoir si l'attribution d'un pointeur est une opération atomique.
Opérations atomiques dans Go
Dans Go, les seules opérations dont le caractère atomique est garanti sont celles trouvées dans le package sync.atomic. En tant que tel, l'attribution d'un pointeur n'est pas nativement atomique.
Affectation sécurisée du pointeur
Pour attribuer un pointeur de manière atomique, vous avez deux options :
Exemple avec Mutex
Voici un exemple utilisant un sync.Mutex pour protéger une affectation de pointeur :
import "sync" var secretPointer *int var pointerLock sync.Mutex func CurrentPointer() *int { pointerLock.Lock() defer pointerLock.Unlock() return secretPointer } func SetPointer(p *int) { pointerLock.Lock() secretPointer = p pointerLock.Unlock() }
Exemple avec des primitives atomiques
Alternativement , vous pouvez utiliser des primitives atomiques pour réaliser atomicité :
import "sync/atomic" import "unsafe" type Struct struct { p unsafe.Pointer // some pointer } func main() { data := 1 info := Struct{p: unsafe.Pointer(&data)} fmt.Printf("info is %d\n", *(*int)(info.p)) otherData := 2 atomic.StorePointer(&info.p, unsafe.Pointer(&otherData)) fmt.Printf("info is %d\n", *(*int)(info.p)) }
Considérations
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!