SDK Multiplataforma en C logo

SDK Multiplataforma en C

Exclusión mutua

❮ Anterior
Siguiente ❯

Los mecanismos de exclusión mutua garantizan que solo una hebra de ejecución pueda acceder a un recurso en el mismo instante.


Funciones

Mutex*bmutex_create (void)
voidbmutex_close (...)
voidbmutex_lock (...)
voidbmutex_unlock (...)

En procesos con múltiples hilos, la exclusión mutua garantiza que solo uno de ellos pueda ejecutar una sección crítica en un instante concreto de tiempo. La sección crítica es un bloque de código que normalmente protege a un recurso compartido que no soporta el acceso concurrente.


1. Cerrojos

Los cerrojos, candados o Mutex son objetos de sincronización gestionados por el sistema operativo que marcan el inicio y final de una sección crítica (Figura 1). Cuando una hebra va a acceder a un determinado recurso compartido, deberá llamar al método bmutex_lock para garantizar el acceso exclusivo. Si otro hilo está utilizando el recurso (ha llamado previamente a bmutex_lock), el hilo actual se detendrá hasta que el recurso se libere mediante bmutex_unlock. Del bloqueo y desbloqueo de hilos se encarga el propio sistema operativo. El programador, tan solo debe preocuparse por identificar y proteger las secciones críticas. Ejemplo multi-hilo.

Esquema de un mecanismo de exclusión mutua protegiendo dos secciones críticas.
Figura 1: Un mutex protegiendo las secciones críticas de dos hebras, que no podrán ejecutarse concurrentemente. El resto del código puede correr en paralelo.

bmutex_create ()

Crea un objeto de exclusión mutua que permite que varios hilos de ejecución compartan un mismo recurso, como una zona de memoria o archivo en disco, impidiendo que accedan al mismo tiempo.

Mutex*
bmutex_create(void);

Retorna

El manejador de la exclusión mutua.

Observaciones

Hebras, Ejemplo multi-hilo.


bmutex_close ()

Cierra el objeto de exclusión mutua y libera memoria.

void
bmutex_close(Mutex **mutex);
mutex

El manejador de la exclusión mutua. Será puesto a NULL tras el cierre.

Observaciones

Hebras, Ejemplo multi-hilo.


bmutex_lock ()

Marca el inicio de una sección crítica, bloqueando el acceso a un recurso compartido. Si otro hilo intenta bloquear, será detenido hasta que el hilo actual llame a bmutex_unlock.

void
bmutex_lock(Mutex *mutex);
mutex

El manejador de la exclusión mutua.

Observaciones

Hebras, Ejemplo multi-hilo.


bmutex_unlock ()

Marca el final de una sección crítica, desbloqueando el acceso a un recurso compartido. Si otro hilo está esperando, se permitirá el acceso a su sección crítica y, por tanto, al recurso compartido.

void
bmutex_unlock(Mutex *mutex);
mutex

El manejador de la exclusión mutua.

Observaciones

Para evitar retrasos innecesarios, el tiempo entre bmutex_lock y bmutex_unlock debe ser lo más corto posible. Cualquier cálculo que la hebra pueda realizar en su espacio privado de memoria debe preceder a la llamada a bmutex_lock. Hebras, Ejemplo multi-hilo.

❮ Anterior
Siguiente ❯