Solución:
Desafortunadamente, todos han pasado por alto la diferencia más importante entre el semáforo y el mutex; el concepto de “propiedad“.
Los semáforos no tienen noción de propiedad, esto significa que cualquier hilo puede liberar un semáforo (esto puede generar muchos problemas en sí mismo, pero puede ayudar con la “detección de muerte”). Mientras que un mutex tiene el concepto de propiedad (es decir, solo puede liberar un mutex que haya adquirido).
La propiedad es increíblemente importante para la programación segura de sistemas concurrentes. Siempre recomendaría usar mutex en lugar de un semáforo (pero hay implicaciones de rendimiento).
Los mutex también pueden admitir herencia de prioridad (que puede ayudar con el problema de inversión de prioridad) y recursividad (eliminando un tipo de interbloqueo).
También debe señalarse que existen semáforos “binarios” y semáforos “contadores / generales”. El semáforo de Java es un semáforo de conteo y, por lo tanto, permite que se inicialice con un valor mayor que uno (mientras que, como se señaló, un mutex solo puede contar conceptual de uno). La utilidad de esto se ha señalado en otras publicaciones.
Entonces, para resumir, a menos que tenga múltiples recursos para administrar, siempre recomendaría el mutex sobre el semáforo.
El semáforo se puede contar, mientras que el mutex solo puede contar hasta 1.
Suponga que tiene un hilo en ejecución que acepta conexiones de cliente. Este hilo puede manejar 10 clientes simultáneamente. Luego, cada nuevo cliente establece el semáforo hasta que llega a 10. Cuando el semáforo tiene 10 banderas, entonces su hilo no aceptará nuevas conexiones
Los mutex se utilizan generalmente para proteger cosas. Suponga que sus 10 clientes pueden acceder a múltiples partes del sistema. Luego, puede proteger una parte del sistema con un mutex para que cuando 1 cliente esté conectado a ese subsistema, nadie más deba tener acceso. También puede utilizar un semáforo para este propósito. Un mutex es un “semáforo de exclusión mutua”.
Mutex es básicamente exclusión mutua. Solo un hilo puede adquirir el recurso a la vez. Cuando un subproceso adquiere el recurso, ningún otro subproceso puede adquirir el recurso hasta que el subproceso propietario del recurso se libera. Se bloquearán todos los subprocesos que esperan adquirir recursos.
El semáforo se utiliza para controlar el número de subprocesos que se ejecutan. Habrá un conjunto fijo de recursos. El recuento de recursos se reducirá cada vez que un hilo posea el mismo. Cuando el recuento de semáforos llega a 0, no se permite que otros subprocesos adquieran el recurso. Los subprocesos se bloquean hasta que otros subprocesos que poseen liberaciones de recursos.
En resumen, la principal diferencia es ¿cuántos subprocesos pueden adquirir el recurso a la vez?
- Mutex: es UNO.
- Semáforo – su DEFINED_COUNT, (tantos como recuento de semáforos)