Regole di programmazione concorrente
Ecco alcune regole utili per scrivere algoritmi concorrenti:
- Accesso sincronizzato a tutti gli elementi (oggetti o variabili) condivisi.
- Istruzioni di Test and Set atomiche: lock, valutazione di una condizione ed eventuale wait devono essere racchiusi all’interno della medesima regione critica (synchronized o mutex).
- Tutte le chiamate alla funzione wait dovrebbero essere condizionate per evitare starvation. Qualora non lo fossero, è necessaria la presenza di un demone, svegliato dai clienti prima di addormentarsi, che svegli i Thread.
- Non separare Sincronizzazione da Sincronizzato: se un oggetto necessita di essere condiviso è necessario svilupparlo per renderlo concorrente direttamente al suo interno, non attraverso l’incapsulazione in un wrapper.
- Usare mappe di oggetti per sincronizzare gruppi di Thread che attendono il medesimo evento oppure, per una specifica richiesta, mappe di Contenitori che si portano dietro l’evento più la lista di Thread in attesa di esso.
- Evitare flag, usare piuttosto blocchi esclusivi nidificati (synchronized) in modo da generare una coda implicita su quello più esterno.
- Barrier Sync attraverso una liste di Thread: fino a quando ha almeno un elemento, nessun altro thread può procedere allo stato successivo. L’ultimo che esce sveglia tutti gli altri.
- Race Condition: evitare che Thread accedano a risorse a caso addormentandoli e svegliando solo quelli che possono acquisire il lock, ordinandoli in base alle risorse richieste. Una volta svegliati, è casuale l’accesso tra loro, ma è garantito che venga ottimizzato il consumo di risorse.
- Date due sequenze di istruzioni atomiche A e B, la loro unione AB non è atomica.
Share this content: