Uno dei problemi più comuni nella sincronizzazione tra unità di esecuzione sono le race condition.
Definizione: race condition
Una race condition (in italiano situazione di corsa) è un problema causato dall’incorretta sincronizzazione tra unità di esecuzione nei sistemi concorrenti quando il risultato finale dell’esecuzione concorrente di unità di esecuzione dipende dalla temporizzazione o dalla sequenza con cui vengono eseguiti.
Vediamo ora un classico esempio di race condition.
Esempio di race condition
Un esempio di race condition è il seguente: supponiamo di avere una variabile intera il cui valore iniziale è e che due processi e eseguano rispettivamente le istruzioni e in modo concorrente. Il solo risultato corretto di questa esecuzione è , ma ciò potrebbe non avvenire.
Queste istruzioni, infatti vengono codificate così in un tipico linguaggio macchina:
- L’istruzione viene codificata come:
- L’istruzione viene codificata come:
(dove e sono due registri della CPU).
L’esecuzione concorrente delle istruzioni e equivale a un’esecuzione sequenziale di queste istruzioni in linguaggio macchina, intercalate in una qualunque sequenza che però conservi l’ordine interno della rispettiva istruzione di alto livello. Ciò significa, per esempio, che in una sequenza qualsiasi si può far eseguire prima di , ma non potrà mai essere possibile eseguire prima di perché altrimenti violerebbero l’ordine interno della loro sequenza nella codifica dell’istruzione .
Una delle sequenze possibili in cui queste istruzioni possono essere intercalate è la seguente:
Istante Processo Istruzione eseguita Valore modificato Questa sequenza porta al risultato finale , che è ovviamente errato. Viceversa, invertendo l’ordine delle istruzioni negli ultimi due istanti e , il risultato finale sarebbe , altrettanto errato.
Questo è accaduto a causa di una race condition tra i due processi e ,