Su un sistema uniprocessore, programmare un'applicazione con un insieme di processi/thread concorrenti può avere diversi vantaggi:
Inoltre, se il processore è multithreading, oppure il sistema è multiprocessore, i vantaggi in termini di efficienza sono ancora più significativi.
La programmazione concorrente presenta però alcune importanti problematiche, legate all'interazione tra processi/thread diversi.
Nella discussione che segue, si suppone che più processi abbiano una zona di memoria condivisa. Di norma, i processi hanno memoria separata, ma
Un esempio di memoria condivisa potrebbe essere un sistema banale di prenotazioni aeree, che usa $n$ terminali connessi a un computer centrale. Questo sistema assegna i posti in ordine sequenziale finchè non sono esauriti.
Si ha un processo per ciascuno degli $n$ terminali, e tutti i processi condividono due variabili:
next_seat
: indica il prossimo posto da assegnaremax
: indica il numero totale di posti sul voloIl programma che gli $n$ terminali eseguono per prenotare un posto sul volo è: