Exclusión mutua
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) |
void | bmutex_close (...) |
void | bmutex_lock (...) |
void | bmutex_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.
- Utiliza bmutex_create para crear un cerrojo.
- Utiliza bmutex_lock para bloquear una sección crítica.
- Utiliza bmutex_unlock para desbloquear una sección crítica.
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.
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
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 |
Observaciones
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
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.