Maison >développement back-end >Golang >L'affectation de pointeurs atomiques est-elle possible dans Go et comment peut-elle être réalisée en toute sécurité ?
Affectation atomique de pointeurs dans Go
Est-il possible d'attribuer atomiquement un pointeur dans Golang ? Plus précisément, si vous souhaitez définir un pointeur sur nil et vous assurer que les autres threads peuvent immédiatement observer le changement, est-il nécessaire d'utiliser un verrou ?
En Java, le mot-clé volatile peut être utilisé pour réaliser l'affectation d'un pointeur atomique, mais un tel mécanisme n'existe pas dans Go.
Réponse :
Les seules opérations atomiques garanties dans Go sont celles fournies par le package sync.atomic. L'attribution d'un pointeur régulier n'est pas intrinsèquement atomique.
Pour garantir l'atomicité, une option consiste à utiliser un verrou, tel que sync.Mutex. Alternativement, vous pouvez envisager d'utiliser l'une des primitives sync.atomic. Cependant, cette dernière nécessite une manipulation prudente et peut être difficile à mettre en œuvre correctement.
Par exemple, considérons le code Go idiomatique suivant :
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() }
Ces fonctions permettent d'accéder à un pointeur tout en maintenant le thread sécurité grâce à l'utilisation d'un mutex.
Alternativement, si possible, il peut être plus idiomatique de limiter l'accès du pointeur à une seule goroutine et d'utiliser des canaux pour communiquer changements.
Utilisation d'atomic.StorePointer
Au lieu d'utiliser des verrous, le package sync/atomic fournit la fonction StorePointer pour l'affectation de pointeurs atomiques. Cependant, cette approche nécessite l'utilisation d'unsafe.Pointer et n'est pas considérée comme une bonne pratique en raison de son potentiel d'erreurs et de son comportement indéfini.
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!