Go Academy · Leçon

Modèle mémoire de Go et Happens-Before

Garanties de synchronisation et ordre mémoire

Leçon 2 sur 413 étapes

Modèle mémoire de Go et Happens-Before est une leçon Go Academy gratuite sur CoddyKit. Ceci est la leçon 2 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Go Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Go Academy comprend 4 leçons au total.

Qu’est-ce que le modèle mémoire ?

Le modèle mémoire de Go définit dans quels cas les écritures effectuées dans une variable par une goroutine sont garanties d’être visibles lors des lectures effectuées par une autre. Sans ces garanties, les programmes concurrents peuvent observer des valeurs obsolètes ou incohérentes.

Relation de précédence

Une relation de précédence garantit que toutes les écritures antérieures à l’événement A sont visibles lors de l’événement B. En l’absence d’une telle relation, les lectures peuvent observer n’importe quelle écriture, y compris la valeur zéro.

Relation de précédence garantie : démarrage d’une goroutine

Tout ce qui se produit avant une instruction go se produit avant le début de la fonction de la goroutine. La goroutine lancée voit toutes les écritures effectuées avant sa création.

x := 10
go func() {
    fmt.Println(x) // guaranteed to see 10
}()

Garantie : envoi et réception sur un canal

Un envoi sur un canal se produit avant la réception correspondante. Une fermeture se produit avant une réception de la valeur zéro. Ce sont les principales primitives de synchronisation.

ch := make(chan int)
go func() { ch <- 42 }()   // send hb receive
v := <-ch
fmt.Println(v) // guaranteed to see 42

Garantie&nbsp;: sync.Mutex

Le n-ième Unlock d’un mutex se produit avant le (n+1)-ième Lock. Ainsi, une goroutine qui verrouille le mutex après son déverrouillage voit toutes les écritures effectuées avant ce déverrouillage.

Garantie&nbsp;: sync.Once

La fin de l’exécution de la fonction once.Do se produit avant le retour de tout appel à once.Do. Toutes les goroutines qui appellent once.Do voient l’initialisation.

Garantie&nbsp;: fermeture d’un canal

La fermeture d’un canal se produit avant une réception qui renvoie la valeur zéro du canal fermé. C’est ainsi qu’un canal de fin diffuse un signal à de nombreuses goroutines.

Aucune relation de précédence&nbsp;: variables partagées non protégées

Si deux goroutines accèdent à une variable sans synchronisation et qu’au moins l’une d’elles écrit dedans, le comportement est indéfini. Le détecteur de courses critiques le détecte.

Opérations atomiques

Le paquet atomic fournit des opérations séquentiellement cohérentes. Un stockage atomique se produit avant un chargement atomique de la même variable dans toute goroutine qui observe la valeur stockée.

Modèle mémoire des canaux

Pour les canaux mis en mémoire tampon de capacité C, la k-ième réception se produit avant la fin du k+C-ième envoi. Cela modélise la capacité limitée du tampon qui garantit la contre-pression.

Règle pratique

Si vous partagez des données entre goroutines, utilisez des canaux pour transférer la propriété, ou des mutex et des opérations atomiques pour protéger les lectures et les écritures. Ne vous fiez pas à votre intuition concernant l’ordre des opérations sans synchronisation.

Vérification rapide

Laquelle des actions suivantes crée une relation de précédence entre des goroutines ?

Récapitulatif&nbsp;: modèle mémoire de Go

Points clés :

  • La relation de précédence définit quand les écritures sont visibles entre les goroutines
  • Les canaux, Mutex, Once et le démarrage d’une goroutine créent des relations HB
  • L’accès non synchronisé à un état mutable partagé est indéfini
  • Utilisez le détecteur de courses critiques pour détecter les violations
Gratuit pour commencer

Apprends Go avec un tuteur IA — gratuit

Écris et exécute du vrai code dans ton navigateur, obtiens de l'aide instantanée d'un tuteur IA disponible 24h/24, et reprends là où tu t'es arrêté sur le web ou dans l'app.

Cours
51
Leçons
203

Questions Fréquemment Posées

La leçon « Modèle mémoire de Go et Happens-Before » est-elle gratuite ?

Oui — le texte complet de « Modèle mémoire de Go et Happens-Before » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Go Academy, passe à CoddyKit PRO. Le cours Go Academy comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « Modèle mémoire de Go et Happens-Before » ?

Garanties de synchronisation et ordre mémoire Tu pratiques Go Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer Go Academy ?

Aucune expérience préalable n'est requise. Go Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 2 sur 4.

Combien de temps prend la leçon « Modèle mémoire de Go et Happens-Before » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon Go Academy ?

Oui. Chaque leçon Go Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. Pile, tas et analyse d’échappement
  2. Modèle mémoire de Go et Happens-Before
  3. Fonctionnement interne du ramasse-miettes
  4. Réduire les allocations : sync.Pool et arènes
← Retour à Go Academy