Maison > développement back-end > Golang > Comment assurer la sécurité des threads dans Go : mutex, atomes ou canaux ?

Comment assurer la sécurité des threads dans Go : mutex, atomes ou canaux ?

Mary-Kate Olsen
Libérer: 2024-12-18 22:14:10
original
402 Les gens l'ont consulté

How to Achieve Thread Safety in Go: Mutexes, Atomics, or Channels?

Comment implémenter la sécurité des threads pour les variables dans Go

En Java, le concept de variables synchronisées garantit qu'un seul thread peut s'exécuter un bloc de code spécifique à un moment donné. Cependant, Go ne propose pas de mot-clé synchronisé explicite.

Justification

Go promeut une approche différente de la synchronisation des threads, guidée par le principe : « Ne communiquez pas en partageant mémoire ; partagez plutôt la mémoire en communiquant." Cela signifie éviter l'accès direct à la mémoire partagée et opter pour des mécanismes basés sur la communication comme les canaux.

Synchronisation basée sur mutex

Si vous rencontrez un scénario où un mutex est nécessaire , voici comment l'implémenter dans Allez :

var (
    mu        sync.Mutex
    protectMe int
)

func getMe() int {
    mu.Lock()
    me := protectMe
    mu.Unlock()
    return me
}

func setMe(me int) {
    mu.Lock()
    protectMe = me
    mu.Unlock()
}
Copier après la connexion

Améliorations

  • Convertissez sync.Mutex en sync.RWMutex pour activer l'accès en lecture simultané.
  • Envisagez d'utiliser le report pour éviter les fuites de ressources en cas d'erreurs.
  • Intégrez le mutex dans la valeur protégée pour améliorer lisibilité et commodité du code.

Synchronisation atomique

Si vous devez protéger une seule valeur, envisagez d'utiliser le package sync/atomic :

var protectMe int32

func getMe() int32 {
    return atomic.LoadInt32(&protectMe)
}

func setMe(me int32) {
    atomic.StoreInt32(&protectMe, me)
}
Copier après la connexion

Approche basée sur la communication

Go encourage l'utilisation des canaux pour communication inter-goroutine, éliminant le besoin de variables partagées. Par exemple, dans un modèle éditeur-abonné :

type topic struct {
    subscribing []chan int
}

var t = &topic{}

func subscribe() chan int {
    ch := make(chan int)
    t.subscribing = append(t.subscribing, ch)
    return ch
}

func publish(v int) {
    for _, ch := range t.subscribing {
        ch <- v
    }
}
Copier après la connexion

Cette approche garantit une communication thread-safe sans partager de mémoire.

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!

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