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é ?

L'affectation de pointeurs atomiques est-elle possible dans Go et comment peut-elle être réalisée en toute sécurité ?

Mary-Kate Olsen
Libérer: 2024-12-12 11:08:10
original
790 Les gens l'ont consulté

Is Atomic Pointer Assignment Possible in Go, and How Can It Be Achieved Safely?

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()
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal