Go Academy · Lezione

Modello di memoria di Go e happens-before

Garanzie di sincronizzazione e ordinamento della memoria

Lezione 2 di 413 passaggi

Modello di memoria di Go e happens-before è una lezione Go Academy gratuita su CoddyKit. Questa è la lezione 2 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Go Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Go Academy include 4 lezioni in totale.

Che cos'è il modello di memoria?

Il modello di memoria di Go definisce quando le scritture di una variabile eseguite da una goroutine sono garantite visibili alle letture eseguite da un'altra. Senza queste garanzie, i programmi concorrenti possono osservare valori obsoleti o incoerenti.

Happens-before

Una relazione happens-before garantisce che tutte le scritture precedenti all'evento A siano visibili all'evento B. Se non esiste una relazione happens-before, le letture possono osservare qualsiasi scrittura, incluso il valore zero.

Happens-before garantito: avvio della goroutine

Tutto ciò che avviene prima di un'istruzione go avviene prima dell'inizio della funzione della goroutine. La goroutine avviata vede tutte le scritture effettuate prima della sua creazione.

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

Garantito: invio e ricezione su un canale

Un invio su un canale avviene prima della ricezione corrispondente. Una chiusura avviene prima di una ricezione del valore zero. Queste sono le primitive di sincronizzazione principali.

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

Garantito: sync.Mutex

L'n-esimo Unlock di un mutex avviene prima dell'(n+1)-esimo Lock. Questo garantisce che una goroutine che acquisisce il lock dopo un unlock veda tutte le scritture effettuate prima dell'unlock.

Garantito: sync.Once

Il completamento della funzione once.Do avviene prima della restituzione di qualsiasi chiamata a once.Do. Tutte le goroutine che chiamano once.Do vedono l'inizializzazione.

Garantito: chiusura del canale

La chiusura di un canale avviene prima di una ricezione che restituisce il valore zero dal canale chiuso. È così che un canale done invia un segnale a molte goroutine.

Nessun happens-before: variabili condivise non protette

Se due goroutine accedono a una variabile senza sincronizzazione e almeno una esegue una scrittura, il comportamento non è definito. Il race detector rileva questo problema.

Operazioni atomiche

Il package atomic fornisce operazioni sequenzialmente coerenti. Uno store atomico avviene prima di un load atomico della stessa variabile in qualsiasi goroutine che osservi il valore memorizzato.

Modello di memoria per i canali

Per i canali bufferizzati di capacità C, la k-esima ricezione avviene prima del completamento del k+C-esimo invio. Questo rappresenta la capacità limitata del buffer, che garantisce il backpressure.

Regola pratica

Se condivide dati tra goroutine, utilizzi i canali per trasferire la proprietà oppure utilizzi mutex o operazioni atomiche per proteggere letture e scritture. Non si affidi all'intuizione sull'ordine delle operazioni senza sincronizzazione.

Verifica rapida

Quale delle seguenti operazioni crea una relazione happens-before tra goroutine?

Riepilogo: modello di memoria di Go

Punti chiave:

  • Happens-before definisce quando le scritture sono visibili tra goroutine
  • Canali, Mutex, Once e l'avvio delle goroutine creano relazioni HB
  • L'accesso non sincronizzato allo stato mutabile condiviso non è definito
  • Utilizzi il race detector per rilevare le violazioni
Gratis per iniziare

Impara Go con un tutor IA — gratis

Scrivi ed esegui vero codice nel tuo browser, ricevi aiuto istantaneo da un tutor IA disponibile 24/7, e riprendi da dove hai lasciato sul web o nell'app.

Corsi
51
Lezioni
203

Domande Frequenti

La lezione «Modello di memoria di Go e happens-before» è gratuita?

Sì — il testo completo di «Modello di memoria di Go e happens-before» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Go Academy, passa a CoddyKit PRO. Il corso Go Academy include 4 lezioni in totale.

Cosa imparerò in «Modello di memoria di Go e happens-before»?

Garanzie di sincronizzazione e ordinamento della memoria Eserciti Go Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare Go Academy?

Non è richiesta alcuna esperienza precedente. Go Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 2 di 4.

Quanto tempo richiede la lezione «Modello di memoria di Go e happens-before»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione Go Academy?

Sì. Ogni lezione Go Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Stack, heap ed escape analysis
  2. Modello di memoria di Go e happens-before
  3. Interni del garbage collector
  4. Ridurre le allocazioni: sync.Pool e arena
← Torna a Go Academy