Sie sind auf Seite 1von 5

ESCUELA DE INFORMATICA

UNIVERSIDAD NACIONAL DE TRUJILLO

Sistemas Operativos, Guia 9 Facultad: Ciencias Fsicas y Matemticas Escuela: Informtica Asignatura: Sistemas Operativos

Tema: MUTEX
Contenido
}

En esta guia se continuara con la sincronizacin de procesos, para este caso veremos otra herramienta para este fin: Mutex: este nos sirve para ordenar o sincronizar los hilos de un proceso, esto se logra, bloqueando o desbloqueando la ejecucin de estos hilos.

(:)bjetivo Especifico

Sincronizacin de hilos con mutex. Manejo de funciones y sus argumentos y variables con mutex.

jntroduccion Teorica
Mutex

Un mutex consiste en una especie de sernaforo binario con dos estados, cerrado y no cerrado. Un mutex es un objeto que permite a los hilos asegurar la integridad de un recurso compartido al que tienen acceso. Tiene dos estados : bloqueado y desbloqueado. Sobre un mutex se pueden realizar las siguientes operaciones:

LOCK: Intenta cerrar el mutex. Si el mutex no esta cerrado, se cierra, todo ello en una acciOn

atOrnica. Si el mutex esta cerrado, el hilo se bloquea. Si dos hilos intentan cerrar el mutex al mismo tiempo, cosa que solo puede pasar en un multiprocesador real, uno de ellos lo consigue y el otro no, bloqueandose. La forma de regular esto depende de la implementaciOn.

UNLOCK: Elimina o libera el cierre del mutex. Si existe uno o mas hilos esperando por el

mutex, se desbloquea exactamente uno, y el resto permanece bloqueado a la espera. Antes de acceder a un recurso compartido un hilo debe bloquear un mutex. Si el mutex no ha sido bloqueado antes por otro hilo, el bloqueo es realizado. Si el mutex ha sido bloqueado antes, el hilo es puesto a la espera. Tan pronto como el mutex es liberado, uno de los hilos en espera a causa de un bloqueo en el mutex es seleccionado para que continue su ejecuciOn, adquiriendo el bloqueo. Un ejemplo de utilizacin de un mutex es igual en el que un hilo A y otro hilo B estan compartiendo un recurso tipico, como puede ser una variable global. El hilo A bloquea el mutex, con lo que obtiene el acceso a la variable. Cuando el hilo B intenta bloquear el mutex, el hilo B es puesto a la espera puesto que el mutex ya ha sido bloqueado antes. Cuando el hilo A finaliza el acceso a la variable global, desbloquea el mutex. Cuando esto suceda, el hilo B continuara la ejecuciOn adquiriendo el bloqueo, pudiendo entonces acceder a la variable.

Hilo A :

Hilo B :

lock(mutex) acceso al recurso unlock(mutex)

lock(mutex) acceso al recurso unlock(mutex)

Un hilo puede adquirir un mutex no bloqueado. De esta forma, la exclusion mutua entre hilos del mismo proceso esta garantizada, hasta que el mutex es desbloqueado permitiendo que otros hilos protejan secciones criticas con el mismo mutex. Si un hilo intenta bloquear un mutex que ya esta bloqueado, el hilo se suspende. Si un hilo desbloquea un mutex y otros hilos estan esperando por el mutex, el hilo en espera con mayor prioridad obtendra el mutex. La tabla 1 muestra un resumen de las funciones mas importantes para la creation y manipulacin de hilos y mutex:
pihread_crcnic pihread_exit
Gesiftia do fiffem

p1hread_kill pthread _join p1hread_self p1hread_matex_init p1liread matex_destroy

Extashin orrataa

pthread inatex_lock p1lireaclinutextrylock p1lireadinutex_wilo2k

Tabla 1: Cuadro resumen de funciones para hilos y mutex


Sistemas Operativos, Guia 9

,Material y Equipo
Sistema operativo Linux con interprete de comandos Bash Compilador gcc Guia de Iaboratorio
2

Procedimiento

Lo que se pretende hacer es que tres hilos impriman cada uno una serie de 5 caracteres (cada hilo un caracter distinto) en pantalla, incluyendo Ia funcin main Ia cual se considera como un hilo.
Programa: mutex01.c

#include <pthread.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> //declarando variable mutex pthreadmutext m; void *funcion01(void *arq){ int i; //bloqueando pthreadmutex_lock(&m); for(i=0; i<5; i++){ printf("."); fflush(stdout); sleep(1); } //desbloqueando pthread_mutex_unlock(&m); return NULL;
}

void *funcion02(void *arq){ int i; //bloqueando pthreadmutex_lock(&m); for(i=0; i<5; i++){ printf("o"); fflush(stdout); sleep(1); } //desbloqueando pthread_mutex_unlock(&m); return NULL;
}

void *funcion03(void *arq){ int i; //bloqueando pthreadmutex_lock(&m); for(i=0; i<5; i++){ printf("+"); fflush(stdout); sleep(1); } //desbloqueando

pthread_mutex_unlock(&m); r e turn NUL L;

int main(void){ int i; pthread_t hl, h2, h3; //iniciando mutex pthreadmutexinit(&m, NULL); if(pthread_create(&hl, NULL, funcion01, NULL)){ printf("error creando hilo"); a b o r t ( );

if(pthread_create(&h2, NULL, funcion02, NULL)){ printf("error creando hilo"); a b o r t ( );

if(pthread_create(&h3, NULL, funcion03, NULL)){ printf("error creando hilo"); a b o r t ( );

pthreadmutex_lock(&m); for(i=0; i<5; i++){ printf("x"); fflush(stdout); s le e p (1 ); 1 pthreadmutexunlock(&m);

//eliminando mutex pthreadmutexdestroy(&m); printf("\n***fin del programa principal ***\n"); exit(0);

Demostracion de la compilation y ejecucion del programa:


usuario@ 50-U b untu:
Archivo Editar Ver Terminal Ayuda usuario@SO-LIbuntu:$ gcc -o mutexiDil rnutexiDiLc -lpthread usuaripSO -Libuntu: $ ./mutex01 ......... p0000+++++xxxxx ***fin del programa principal *** usuario@SO-Ulauntu:$

CI M

5 1. 1

Sistemas Operativos, Guia 9


Kernighan, Brian W. El Entorno de Programackin Unix Editorial Prentice Hall. 1987
i

,Fuentes de Consulta

Das könnte Ihnen auch gefallen