pthreads mutex vs semáforo

9 minutos de lectura

pthreads mutex vs semaforo
cppdev

¿Cuál es la diferencia entre los semáforos y mutex proporcionados por la biblioteca pthread?

  • Los semáforos no son proporcionados por pthreads y también se pueden usar en programas sin subprocesos.

    – efímero

    14 de enero de 2010 a las 18:51

  • cualquier construcción de sincronización se puede usar en código sin subprocesos: P

    – Hassan Sied

    14 de enero de 2010 a las 19:15

  • Bueno, la diferencia que pretendía resaltar es que los semáforos estaban en uso antes que los pthreads. Puedes colocar un sem_t en memoria compartida y usarlo para sincronizar operaciones entre procesos. Por otro lado, incluso si no crea varios subprocesos, debe compilar y vincular con -pthread para usar pthread_mutex_*. (Algunas plataformas no imponen esto, pero ese es el estándar).

    – efímero

    14 de enero de 2010 a las 20:51


  • @ephemient, en realidad man sem_init en Linux dice: Link with -pthread. Así que supongo que Linux no sigue POSIX al pie de la letra.

    – Alexis Wilke

    28 de mayo de 2014 a las 2:07

1647590411 563 pthreads mutex vs semaforo
hassan syed

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.

  • Una diferencia significativa (ya que he visto a personas cometer este error antes): un semáforo puede ser adquirido y desocupado por cualquier subproceso en cualquier secuencia (siempre que el conteo nunca sea negativo), pero un mutex puede solamente ser desbloqueado por el hilo que lo bloqueó. Intentar desbloquear un mutex que fue bloqueado por otro subproceso es un comportamiento indefinido.

    – efímero

    14 de enero de 2010 a las 18:50

  • @ephemient, eso habría sido una gran respuesta, muy perspicaz

    – Matt Carpintero

    15 de enero de 2010 a las 9:06

  • @ephemient: por la razón que especifica, la última afirmación en la respuesta es falsa: NO PUEDE representar un semáforo por un INT que está sincronizado por un mutex ya que, si se mantiene el mutex, no puede incrementar/decrementar el int de otro subproceso, y tendrá que esperar a que el subproceso de bloqueo libere el mutex. La diferencia fundamental es que se posee el mutex, mientras que no se posee el semáforo. Y esa propiedad, a través de la sincronización impuesta, se transmite a la INT. Por lo tanto, obtiene un semáforo propietario híbrido, en algún lugar entre el semáforo sin propietario y el mutex propietario.

    – usuario1284631

    12 de febrero de 2013 a las 11:15


  • Creo que esta respuesta aún pierde una distinción MUY crucial entre un semáforo y un mutex; ese es el uso. Los semáforos son mecanismos de señalización en su corazón; el hecho de que puedan ser incrementados y decrementados por cualquier subproceso es solo el resultado de esto. Los semáforos se utilizan para señalar a otros flujos de control algo relacionado con la sincronización (como un búfer lleno/vacío). Un mutex, por otro lado, siempre se usa para proteger el acceso múltiple a un objeto compartido. Esa es una gran diferencia y la gente de alguna manera siempre parece pasarla por alto, o nunca entiendo lo que están tratando de decir. :PAGS

    – Fingolfin

    11/06/2013 a las 20:45


1647590411 194 pthreads mutex vs semaforo
Paxi

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 llegar al 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 hayas 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 su 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”.

  • me gusta el alcance parte. Se refiere a la parte de implementación que difiere en semáforo binario y mutex.

    – KRoy

    17 mayo 2016 a las 18:06

El ejemplo del baño

exclusión mutua:

Es una llave para un inodoro. Una persona puede tener la llave – ocupar el baño – en ese momento. Cuando termina, 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 un subproceso en 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 gratuitas. Por ejemplo, supongamos 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

1647590412 793 pthreads mutex vs semaforo
Aprendiz C

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 exclusión mutua, tanto la adquisición como la liberación se manejan de la misma manera.

pthreads mutex vs semaforo
KRoy

La diferencia entre el semaphore y mutex es la diferencia entre mecanismo y patrón. La diferencia está en su propósito (intención)y cómo funcionan(conductual).

los mutex, barrier, pipeline están patrones de programación paralela. Mutex se usa (destinado a) para proteger un critical section y asegurar mutual exclusion. Barrier hace que los agentes (hilo/proceso) sigan esperando el uno al otro.

Una de las características (conducta) de mutex El patrón es que solo los agentes permitidos (proceso o subproceso) pueden ingresar a una sección crítica y solo esos agentes pueden salir voluntariamente de eso.

Hay casos en que mutex permite un solo agente a la vez. Hay casos en los que permite múltiples agentes (múltiples lectores) y no permite otros agentes (escritores).

los semaphore es un mecanismo eso puede ser usado(destinado a) para implementar diferentes patrones. Está(conducta) generalmente un bandera(posiblemente protegido por exclusión mutua). (Un hecho interesante es incluso mutex patrón se puede utilizar para implementar el semáforo).

En la cultura popular, semaphores son mecanismos provistos por kernels, y mutexes son proporcionados por la biblioteca de espacio de usuario.

Tenga en cuenta que hay conceptos erróneos sobre semaphores y mutexes. Dice que semaphores se utilizan para synchronization. Y mutexes posee ownership. Esto se debe a los libros populares sobre sistemas operativos. Pero la verdad es que todos los mutex, semáforos y barreras se utilizan para la sincronización. La intención de mutex no es ownership pero mutual exclusion. Este concepto erróneo dio lugar a una pregunta popular en las entrevistas que preguntaba la diferencia de mutexes y binary-semaphores.

Resumen,

intención

  • exclusión mutua, exclusión mutua
  • semáforo, implementar patrones de diseño paralelos

conducta

  • mutex, solo los agentes permitidos ingresan a la sección crítica y solo ellos pueden salir
  • semáforo, ingrese si la bandera dice ir, de lo contrario espere hasta que alguien cambie la bandera

En la perspectiva del diseño, mutex es más como state-pattern donde el algoritmo que es seleccionado por el estado puede cambiar el estado. los binary-semaphore es más como strategy-pattern donde el algoritmo externo puede cambiar el estado y eventualmente el algoritmo/estrategia seleccionado para ejecutar.

1647590412 565 pthreads mutex vs semaforo
Comunidad

Estos dos artículos explican grandes detalles sobre exclusión mutua contra semáforos
Además, esta respuesta de desbordamiento de pila dice una respuesta similar.

1647590413 534 pthreads mutex vs semaforo
ajinkya

Semaphore se usa más como bandera, para lo cual realmente no necesita traer RTOS / OS. El semáforo puede ser cambiado accidental o deliberadamente por otros subprocesos (por ejemplo, debido a una mala codificación). Cuando enhebra el uso de exclusión mutua, posee los recursos. Ningún otro hilo puede acceder a él antes de que el recurso se libere.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad