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.
fonte
2012-07-17 18:11:09
L'OP stava chiedendo di un binario semaforo versus (sempre-binario) mutex, non contato semaforo versus mutex. –