2012-07-17 15 views
6

Durante la lettura merito semaforo binario e mutex ho scoperto questa differenza:Dove usare il semaforo binario quando sono disponibili i mutex?

Entrambi possono avere valore 0 e 1, ma mutex può essere sbloccato dalla stessa filo che ha acquisito il blocco mutex. Un thread che acquisisce il blocco mutuo può avere l'inversione di priorità nel caso in cui un processo con priorità più alta desideri acquisire lo stesso mutex mentre questo non è il caso con semaforo binario.

Quindi dove dovrei usare i semafori binari? Qualcuno può citare un esempio?

EDIT: Penso di aver capito il funzionamento di entrambi. Sincronizzazione dell'offerta di semaforo in modo binario mentre mutex offre un meccanismo di blocco. Ho letto alcuni esempi del libro di Galvin OS per renderlo più chiaro.

risposta

5

Una situazione tipica in cui trovo i semafori binari molto utili è per l'inizializzazione del thread in cui il thread leggerà da una struttura di proprietà del thread padre. Il thread padre deve attendere che il nuovo thread legga i dati condivisi dalla struttura prima che possa lasciare la fine della vita della struttura (lasciando il suo ambito, per esempio). Con un semaforo binario, tutto ciò che devi fare è inizializzare il valore del semaforo su zero e chiedere al bambino di postarlo mentre il genitore attende su di esso. Senza i semafori, avresti bisogno di una variabile mutex e condition e di una logica del programma molto più brutta per utilizzarli.

1

L'esempio canonico per l'utilizzo di un semaforo conteggiato invece di un mutex binario è quando si dispone di un numero limitato di risorse disponibili che sono a) intercambiabili eb) più di una.

Ad esempio, se si desidera consentire a un massimo di 10 lettori di accedere a un database contemporaneamente, è possibile utilizzare un semaforo conteggiato inizializzato su 10 per limitare l'accesso alla risorsa. Ogni lettore deve acquisire il semaforo prima di accedere alla risorsa, diminuendo il numero disponibile. Una volta che il conteggio raggiunge 0 (cioè 10 lettori hanno avuto accesso e stanno usando il database), tutti gli altri lettori sono bloccati. Una volta che il lettore ha terminato, fa risalire il conteggio del semaforo di uno per indicare che non sta più utilizzando la risorsa e che qualche altro lettore può ora ottenere il blocco del semaforo e ottenere l'accesso al suo posto.

Tuttavia, il semaforo contato, proprio come tutte le altre primitive di sincronizzazione, ha molti casi d'uso ed è solo una questione di pensare fuori dagli schemi. Potresti scoprire che molti problemi che sei abituato a risolvere con un mutex più una logica aggiuntiva possono essere implementati più facilmente e più facilmente con un semaforo. Un mutex è un sottoinsieme del semaforo, vale a dire, tutto ciò che puoi fare con un mutex può essere fatto con un semaforo (basta impostare il conto su uno), ma ci sono cose che possono essere fatte con un semaforo da solo non può essere fatto solo con un mutex.

Alla fine della giornata, una qualsiasi primitiva di sincronizzazione è in genere sufficiente per fare qualsiasi cosa (si pensi che sia "completa di turing" per la sincronizzazione dei thread, per imbastire quella parola). Tuttavia, ognuno è adattato su misura a un'applicazione diversa e, sebbene sia possibile forzare uno a eseguire le proprie offerte con alcune personalizzazioni e colla aggiuntiva, è possibile che una primitiva di sincronizzazione diversa sia più idonea per il lavoro.

+3

L'OP stava chiedendo di un binario semaforo versus (sempre-binario) mutex, non contato semaforo versus mutex. –

3

In quasi tutti i casi, utilizzo semaforo binario per segnalare altri thread senza bloccare.

semplice esempio di utilizzo per la richiesta sincrona:

Discussione 1:

Semaphore sem; 
request_to_thread2(&sem); // Function sending request to thread2 in any fashion 
sem.wait();    // Waiting request complete 

Discussione 2:

Semaphore *sem; 
process_request(sem);  // Process request from thread 1 
sem->post();    // Signal thread 1 that request is completed 

Nota: prima del post semaforo in filo 2 trasformazione è possibile impostare in modo sicuro i dati di thread 1 senza alcuna sincronizzazione aggiuntiva.