Semaforo vs Mutex
Il semaforo è una struttura di dati che viene utilizzata per garantire che più processi non accedano a una risorsa comune o a una sezione critica contemporaneamente, in ambienti di programmazione paralleli. I semafori sono usati per evitare serrature morte e condizioni di gara. Mutex (Mutual Exclusion Object) viene anche utilizzato per evitare l'accesso a una risorsa comune nello stesso momento da diversi processi simultanei.
Cos'è un semaforo?
Il semaforo è una struttura dati utilizzata per fornire l'esclusione reciproca alle sezioni critiche. I semafori supportano principalmente due operazioni chiamate wait (storicamente note come P) e signal (storicamente note come V). L'operazione di attesa blocca un processo fino a quando il semaforo non è aperto e l'operazione di segnale consente ad un altro processo (thread) di entrare. Ogni semaforo è associato a una coda di processi in attesa. Quando l'operazione di attesa viene chiamata da un thread, se il semaforo è aperto, il thread può continuare. Se il semaforo viene chiuso quando l'operazione di attesa viene chiamata da un thread, il thread viene bloccato e deve attendere in coda. L'operazione di segnale apre un semaforo e se c'è un thread già in attesa in coda, quel processo è permesso di procedere e se non ci sono thread in attesa in coda il segnale viene ricordato per i thread successivi. Ci sono due tipi di semafori chiamati semifori mutex e conteggio di semafori. I semafori Mutex consentono un singolo accesso a una risorsa e il conteggio dei semafori consente a più thread di accedere a una risorsa (che ha diverse unità disponibili).
Cos'è un Mutex?
Quando viene avviata un'applicazione per computer, creerà un mutex e lo collegherà a una risorsa. Quando la risorsa viene utilizzata da un thread, è bloccata e altri thread non possono usarla. Se un altro thread vuole usare la stessa risorsa, dovrà fare una richiesta. Quindi quel thread verrà inserito in una coda fino al termine del primo thread con la risorsa. Quando il primo thread termina con la risorsa, il blocco verrà rimosso e il thread in attesa nella coda potrà accedere alla risorsa. Se ci sono più thread in attesa in coda, gli viene concesso l'accesso a rotazione. In pratica, quando il mutex alterna l'accesso a una risorsa tra più thread, sarà visibile mentre più thread consumano una risorsa allo stesso tempo. Ma internamente solo un singolo thread accede alla risorsa in un dato momento.
Qual è la differenza tra Semaphore e Mutex?
Anche se, sia i semafori che gli oggetti mutex sono usati per ottenere l'esclusione reciproca in ambienti di programmazione paralleli, hanno alcune differenze. Un oggetto mutex consente solo a un singolo thread di consumare una risorsa o una sezione critica, mentre i semafori consentono un numero limitato di accessi simultanei a una risorsa (con un numero massimo consentito). Con gli oggetti mutex, gli altri thread che desiderano accedere alla risorsa devono attendere in una coda, finché il thread corrente non è terminato utilizzando la risorsa.