Google+ Quarta Info B: Mutex e semafori.

venerdì 15 febbraio 2013

Mutex e semafori.

Come già parlato nei post dei thread, per gestire le corse critiche utilizziamo le mutex.
Le mutex sono delle speciali variabili a livello kernel che ci permettono di gestire l'ingresso in una zona critica (Cioè una zona di istruzioni che interessa la modifica di variabili globali o di un file condiviso che deve essere eseguita da un solo thread o processo alla volta, dall'inizio alla fine) da parte di 2 o più thread / processi.
Le mutex, essendo variabili in kernel space possono essere modificate solo tramite delle chiamate di sistema particolari.

La sintassi delle mutex è la seguente:

-La creazione ed inizializzazione di una variabile mutex.

pthread_mutex_t    mutex = PTHREAD_MUTEX_INITIALIZER;

pthread_mutex_t è la variabile con qui si dichiarano le mutex, PTHREAD_MUTEX_INITIALIZER invece serve per inizializzare la nostra variabile mutex

-Le due chiamate di sistema

pthread_mutex_lock(&mutex);
pthread_mutex_unlock(&mutex);

pthread_mutex_lock e pthread_mutex_unlock servono rispettivamente, come fanno intuire i loro nomi, a bloccare e sbloccare la variabile mutex.

Il funzionamento di queste variabili è semplice: quando un thread entra nella zona critica blocca la variabile mutex, perciò quando un altro thread cercherà di entrare nella zona critica (eseguendo anch'esso una pthread_mutex_unlock(&mutex) ) il thread si bloccherà fino a quando l'altro thread non uscirà dalla zona critica, sbloccando la mutex.
Nel caso ci fossero più thread bloccati sulla stessa mutex sarò il S.O. a scegliere quale thread mandare in esecuzione.
Da notare -> il S.O. quando viene eseguita una pthread_mutex_unlock va a controllare se ci sono dei thread bloccati su quella variabile: se ci sono manderà in esecuzione uno dei thread bloccati (senza modificare il valore della mutex), altrimenti sbloccherà definitivamente la mutex.

Ce un altro tipo di variabile che può fare lo stesso lavoro delle mutex: sono le variabili semaphore, cioè semaforo.
I semafori per bloccare e sbloccare hanno anch'essi 2 chiamate di sistema, che noi chiameremo molto semplicemente up e down.

Queste tipo di variabile è come se fosse un intero: parte da 1 (che rappresenta lo stato iniziale del semaforo, cioè che si può accedere a quella determinata zona critica) e ogni volta che un thread cerca di entrare nella zona critica il semaforo si decrementa di uno. Quando un thread esce dalla zona critica dovrà eseguire lo sblocco, cioè una up.

Praticamente non ci sono differenze tra l'utilizzo di una variabile mutex o una semaforo per la gestione tra thread.







Nessun commento:

Posta un commento