GNU/Linux >> Tutoriales Linux >  >> Linux

pthreads mutex vs semáforo

mutex se usa para evitar la condición de carrera entre múltiples subprocesos.

mientras que el semáforo se utiliza como elemento de sincronización utilizado en múltiples procesos.

mutex no se puede reemplazar con un semáforo binario ya que un proceso espera el semáforo mientras que otro proceso libera el semáforo. En caso de mutex, tanto la adquisición como la liberación se manejan de la misma manera.


Voy a hablar sobre Mutex vs Binary-Semaphore. Obviamente, usa mutex para evitar que otro hilo acceda a los datos en un hilo al mismo tiempo.

(Suponga que acaba de llamar a lock() y está en el proceso de acceder a los datos. Esto significa que no espera que ningún otro subproceso (u otra instancia del mismo código de subproceso) acceda a los mismos datos bloqueados por el mismo mutex Es decir, si es el mismo código de subproceso que se ejecuta en una instancia de subproceso diferente, golpea el bloqueo, entonces el bloqueo () debería bloquear el flujo de control).

Esto se aplica a un subproceso que usa un código de subproceso diferente, que también accede a los mismos datos y que también está bloqueado por el mismo mutex.

En este caso, todavía está en el proceso de acceder a los datos y puede tomar, digamos, otros 15 segundos para alcanzar el desbloqueo de exclusión mutua (de modo que el otro subproceso que se bloquea en el bloqueo de exclusión mutua se desbloquearía y permitiría que el control acceder a los datos).

¿Alguna vez permite que otro subproceso desbloquee el mismo mutex y, a su vez, permita que el subproceso que ya está esperando (bloqueando) en el bloqueo de mutex se desbloquee y acceda a los datos? (Espero que haya entendido lo que estoy diciendo aquí).

Según la definición universal acordada,

  • con "mutex" esto no puede suceder. Ningún otro hilo puede desbloquear el bloqueo en tu hilo
  • con "binary-semaphore" esto puede suceder. Cualquier otro hilo puede desbloquear el bloqueo en su hilo

Por lo tanto, si es muy particular acerca del uso de semáforos binarios en lugar de mutex, entonces debe tener mucho cuidado al "evaluar" los bloqueos y desbloqueos, es decir, que cada flujo de control que golpea cada bloqueo debe golpear una llamada de desbloqueo y también no debería haber ningún "primer desbloqueo", sino que debería ser siempre "primer bloqueo".


El ejemplo del inodoro

exclusión mutua:

Es una llave para un inodoro. Una persona puede tener la llave - ocupar el baño - en ese momento. Al terminar, la persona entrega (libera) la llave a la siguiente persona en la cola.

"Los mutex generalmente se usan para serializar el acceso a una sección de código reentrante que no puede ser ejecutado simultáneamente por más de un subproceso. Un objeto mutex solo permite que un subproceso ingrese a una sección controlada, lo que obliga a otros subprocesos que intentan obtener acceso a esa sección. esperar hasta que el primer hilo haya salido de esa sección".

(Un mutex es realmente un semáforo con valor 1.)

Semáforo:

Es el número de llaves de baño idénticas libres. Por ejemplo, digamos que tenemos cuatro baños con cerraduras y llaves idénticas. El conteo de semáforos, el conteo de llaves, se establece en 4 al principio (los cuatro baños están libres), luego el valor del conteo disminuye a medida que ingresan personas. Si todos los baños están llenos, es decir. no quedan claves libres, el recuento de semáforos es 0. Ahora, cuando eq. una persona sale del baño, el semáforo aumenta a 1 (una tecla libre) y se entrega a la siguiente persona en la cola.

"Un semáforo restringe la cantidad de usuarios simultáneos de un recurso compartido hasta un número máximo. Los subprocesos pueden solicitar acceso al recurso (disminuyendo el semáforo) y pueden indicar que han terminado de usar el recurso (incrementando el semáforo)."

Fuente


los semáforos tienen un contador sincronizado y los mutex son solo binarios (verdadero/falso).

Un semáforo se usa a menudo como un mecanismo definitivo para responder cuántos elementos de un recurso están en uso; por ejemplo, un objeto que representa n subprocesos de trabajo podría usar un semáforo para contar cuántos subprocesos de trabajo están disponibles.

La verdad es que puedes representar un semáforo por un INT que está sincronizado por un mutex.


Linux
  1. ¿Qué comandos de Unix se pueden usar como semáforo/bloqueo?

  2. Error:"Identificador eliminado:no se pudo obtener el mutex de aceptación" en los registros de error de apache

  3. Cómo usar ejemplos de bloqueo C Mutex para la sincronización de subprocesos de Linux

  4. Spinlock frente a semáforo

  5. ¿Cuál es la diferencia entre mutex y sección crítica?

¿Pthreads y Vfork?

Cómo cambiar los límites de semáforos del kernel en CentOS/RHEL

Error de afirmación de mutex de pthread

¿Cómo recupero un semáforo cuando el proceso que lo redujo a cero falla?

pthreads mutex vs semáforo

¿Por qué los bloqueos giratorios son buenas opciones en el diseño del kernel de Linux en lugar de algo más común en el código de la zona de usuario, como el semáforo o la exclusión mutua?