FACULTAD DE INGENIERA
ESCUELA ACADMICO PROFESIONAL DE INGENIERA EN INFORMTICA
Y SISTEMAS
LABORATORIO N 13 BLOQUEO AVANZADO Y VARIABLES CONDICIONALES
DOCENTES
CURSO
Programacin Paralela
AO DE ESTUDIO
Segundo
TURNO
Maana
ESTUDIANTE
CDIGO
2011-119027
FECHA DE ELABORACIN
24 /11/2014
FECHA DE ENTREGA
01/12/2014
TACNA PER
2014
SECCIN
CAPTULO 1
OBJETIVOS
CAPTULO 2
FUNDAMENTO TERICO
Variables Condicionales
Las variables de condicin son otro mecanismo de sincronizacin entre hilos. Las variables
de condicin usadas en conjunto con mutex permiten a un hilo esperar por la ocurrencia de
una condicin arbitraria. La espera es libre de carreras crticas. (Sincronizacin de Hilos
POSIX: Variables de Condicin)
CAPTULO 3
PROCEDIMIENTO Y DESARROLLO
En la prctica anterior, se estudiamos cmo utilizar mutex para arreglar los problemas de
concurrencia. En esta prctica se seguir estudiando las exclusiones mutuas con tcnicas
ms avanzadas. Tambin estudiaremos otra tcnica de concurrencia de C ++ 11: Variables
condicionales.
BLOQUEO RECURSIVO
Hay una solucin sencilla a este problema: std :: recursive_mutex. Con este mutex se
puede adquirir en varias ocasiones por el mismo hilo. Esta es la versin correcta de la
estructura Complex:
BLOQUE TEMPORIZADO
A veces, no deseamos que un hilo espere un tiempo infinito para un mutex, sobre todo si el
hilo puede hacer otra cosa en vez de esperar. Para este propsito, la biblioteca estndar
tiene una solucin: std::timed_mutex y std::recursive_timed_mutex (si usted necesita las
propiedades recursivas del mutex). Usted tendr acceso a las mismas funciones que un
std::mutex: lock() y untock(), pero hay tambin dos nuevas funciones: try_lock_for() y
try_ lock_until().
El primero de ellos es el ms til. Permite establecer un tiempo de espera. La funcin
devuelve true si el bloqueo se ha logrado, false en caso contrario. Probemos con un ejemplo
sencillo:
A veces usted necesita que la funcin sea llamada slo una vez sin importar el nmero de
hilos que se utilizan. Imagine una funcin que tiene dos partes. La primera parte tiene que
ser llamada una sola vez y la segunda tiene que ser ejecutado cada vez que se llama a la
funcin. Podemos utilizar la funcin std::call_once para solucionar este problema con
mucha facilidad. He aqu un ejemplo que utiliza este mecanismo:
VARIABLES CONDICIONALES
Una variable de condicin administra una lista de subprocesos en espera hasta que otro hilo
les notifique. Cada hilo que quiere esperar a la variable de condicin tiene que adquirir un
bloqueo en primer lugar. El bloqueo se libera cuando el hilo comienza a esperar en la
condicin y el bloqueo se vuelve a recuperar cuando se despierta el hilo.
Un muy buen ejemplo es un concurrente Bounded Buffer. Es una memoria intermedia
cclica con una cierta capacidad con un comienzo y un fin. Aqu est nuestra aplicacin de
forma unida Buffer utilizando variables de condicin:
Un muy buen ejemplo es un buffer limitado. Un buffer es una memoria intermedia cclica
con una cierta capacidad, con un comienzo y con un fin. Aqu se muestra una
implementacin de un buffer limitado utilizando variables de condicin.
Los mutex son administrados por std::unique_lock. Esto es necesario para ser utilizado
con las variables de condicin. Para despertar un hilo que est esperando una variable
condicional, se utiliza la funcin notify_one(). La funcin de espera es un poco especial. Se
toma como primer argumento el unique lock y como el segundo un predicado. El predicado
debe devolver false cuando la espera se debe continuar (esto es equivalente a
while(!pred()){cv.wait(I);}). El resto del ejemplo tiene nada especial.
Podemos utilizar esta solucionar el problema de varios consumidores / productores. Este
problema es muy comn en la programacin concurrente. Varios hilos (consumidores)
estn a la espera de los datos producidos por otros hilos (productores). Aqu hay un ejemplo
con varios hilos utilizando la estructura:
10
11
CAPTULO 4
ACTIVIDADES
A. Programe el siguiente cdigo e interprtelo.
Figura 15 - Actividad
12
Responda:
Qu es lo que realiza el programa?
13
CAPTULO 7
CONCLUSIONES
14
BIBLIOGRAFA
15