Nell’esempio precedente abbiamo usato il locking esplicito con mutex per sincronizzare l’accesso allo stato condiviso attraverso più goroutine. Un’altra opzione è utilizzare le funzionalità di sincronizzazione integrate delle goroutine e dei canali per ottenere lo stesso risultato. Questo approccio basato sui canali si allinea con le idee di Go di condividere la memoria comunicando e avere ogni pezzo di dati posseduto esattamente da 1 goroutine. |
|
![]() ![]()
|
|
|
|
In questo esempio il nostro stato sarà posseduto da una singola
goroutine. Questo garantirà che i dati non vengano mai
corrotti dall’accesso simultaneo. Per leggere o
scrivere tale stato, altre goroutine invieranno messaggi
alla goroutine proprietaria e riceveranno le corrispondenti
risposte. Queste |
|
|
|
Come prima conteremo quante operazioni eseguiamo. |
|
I canali |
|
Ecco la goroutine che possiede lo |
|
Questo avvia 100 goroutine per emettere letture alla
goroutine proprietaria dello stato tramite il canale |
|
Avviamo anche 10 scritture, usando un approccio simile. |
|
Lasciamo lavorare le goroutine per un secondo. |
|
Infine, catturiamo e riportiamo i conteggi delle operazioni. |
|
Eseguendo il nostro programma vediamo che l’esempio di gestione dello stato basato su goroutine completa circa 80.000 operazioni totali. |
|
Per questo caso particolare l’approccio basato su goroutine è stato un po’ più complesso di quello basato su mutex. Potrebbe essere utile in certi casi però, per esempio dove hai altri canali coinvolti o quando gestire più mutex del genere sarebbe soggetto a errori. Dovresti usare l’approccio che ti sembra più naturale, specialmente riguardo alla comprensione della correttezza del tuo programma. |
Prossimo esempio: Ordinamento.