Un semaforo S è una variabile intera
Ad un semaforo si può accedere solo tramite due operazioni atomiche:
wait(S)
{
while (S <= 0); //non-op
S--;
}
signal(S)
{
S++;
}
Variabili condivise: semaforo mutex;
//inizialmente mutex = 1
Processo $P_i$:
do
{
wait(mutex);
sezione critica
signal(mutex);
sezione non critica
} while (1);
Sincronizzazione che non necessita di attesa attiva (busy waiting)
Si può definire un semaforo come una struttura:
typedef struct
{
int valore;
struct processo *L;
} semaforo;
Assumiamo l’esistenza di due funzioni;
Le operazioni sui semafori sono ora definite da:
void wait(semaforo *S)
{
S.valore--;
if (S.valore < 0)
{
aggiungi questo processo a S.L;
block();
}
}
void signal(semaforo *S)
{
S.valore++;
if (S.valore <= 0)
{
togli un processo P da S.L;
wakeup(P);
}
}