Anda di halaman 1dari 16

AO DE LA PROMOCIN DE LA INDUSTRIA RESPONSABLE Y DEL COMPROMISO CLIMTICO

FACULTAD DE INGENIERA
ESCUELA ACADMICO PROFESIONAL DE INGENIERA EN INFORMTICA
Y SISTEMAS
LABORATORIO N 13 BLOQUEO AVANZADO Y VARIABLES CONDICIONALES
DOCENTES

Ing. Hugo Barraza Vizcarra


Ing. Ana Cori Morn

CURSO

Programacin Paralela

AO DE ESTUDIO

Segundo

TURNO

Maana

ESTUDIANTE

Roco Elizabeth Paria Paredes

CDIGO

2011-119027

FECHA DE ELABORACIN

24 /11/2014

FECHA DE ENTREGA

01/12/2014

TACNA PER
2014

SECCIN

LABORATORIO N 13 -"BLOQUEO AVANZADO Y VARIABLES CONDICIONALES"

CAPTULO 1

OBJETIVOS

Comparar el bloqueo comparado en C++ y en Pascal FC.

Implementar variables condicionales.

LABORATORIO N 13 -"BLOQUEO AVANZADO Y VARIABLES CONDICIONALES"

CAPTULO 2
FUNDAMENTO TERICO

Variables Condicionales

Son variables de sincronizacin asociadas a un mutex. Estas variables nos ayudan a


sincronizar nuestros bloqueos entre hilos. Por ejemplo realizamos un bloqueo pero tenemos
que esperar a que otro recurso realice una accin, con estas variables podemos esperar esta
accin. Estas variables pueden realizar principalmente dos acciones: wait y signal. Las
operaciones conviene realizarlas entre lock y unlock de un mutex. (Cortes)

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)

LABORATORIO N 13 -"BLOQUEO AVANZADO Y VARIABLES CONDICIONALES"

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

Estudiemos la siguiente clase:

Figura 1 Estructura Complex

Y desea agregamos una funcin que realice ambas operaciones:

Figura 2 Cdigo de funcin que realiza ambas operaciones

LABORATORIO N 13 -"BLOQUEO AVANZADO Y VARIABLES CONDICIONALES"

Ahora, es hora de probar esta funcin:

Figura 3 Funcin principal

Si se inicia esta aplicacin, el programa nunca termina. El problema es muy simple. En la


funcin de both (), el hilo adquiere el bloqueo y despus llama a la funcin mul (). En esta
funcin, el hilo intenta adquirir lock de nuevo, pero lock ya est bloqueado. Este es un caso
especial de bloqueo. Por defecto, un hilo no puede adquirir el mismo mutex dos veces.

Figura 4 Programa completo

LABORATORIO N 13 -"BLOQUEO AVANZADO Y VARIABLES CONDICIONALES"

Figura 5 Captura de pantalla

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:

Figura 6 - Versin correcta de la estructura Complex

LABORATORIO N 13 -"BLOQUEO AVANZADO Y VARIABLES CONDICIONALES"

Esta vez, la aplicacin funciona correctamente.

Figura 7 Programa completo y correcto

Figura 8 Captura de pantalla de versin correcta de la estructura Complex

LABORATORIO N 13 -"BLOQUEO AVANZADO Y VARIABLES CONDICIONALES"

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:

Figura 9 Ejemplo con bloqueo temporizado

La primera cosa interesante en este ejemplo es la declaracin de la duracin con


std::chrono::milliseconds. Esta tambin es una nueva caracterstica del estndar de C ++
11. Usted puede usar varias unidades de tiempo: nanosegundos, microsegundos,
milisegundos, segundos, minutos y horas. Utilizamos una variable de este tipo para
establecer el tiempo de espera de la funcin try_lock_for. Tambin utilizamos esto para que
un hilo duerma con std::this_thread::sleep_for(duration). El resto del ejemplo no tiene
nada complicado, slo algunas impresiones para ver los resultados visuales. Tenga en
cuenta que el programa nunca se detiene.
7

LABORATORIO N 13 -"BLOQUEO AVANZADO Y VARIABLES CONDICIONALES"

UNA SOLA LLAMADA

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:

Figura 10 Ejemplo con una sola llamada

Figura 11 Captura de pantalla del programa

LABORATORIO N 13 -"BLOQUEO AVANZADO Y VARIABLES CONDICIONALES"

Cada std::call_once corresponde a una variable std::once_flag.

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.

Figura 12 Primera parte del programa con variables condicionales

LABORATORIO N 13 -"BLOQUEO AVANZADO Y VARIABLES CONDICIONALES"

Figura 13 Segunda parte del programa de variables condicionales

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

LABORATORIO N 13 -"BLOQUEO AVANZADO Y VARIABLES CONDICIONALES"

Figura 14 Problema de Productores/Consumidores

Tres hilos de consumo y dos hilos de productores se crean y consultar la estructura


constantemente. Una cosa interesante de este ejemplo es el uso de std::ref al pasar el buffer
por referencia, esto es necesario para evitar una copia del buffer.

11

LABORATORIO N 13 -"BLOQUEO AVANZADO Y VARIABLES CONDICIONALES"

CAPTULO 4
ACTIVIDADES
A. Programe el siguiente cdigo e interprtelo.

Figura 15 - Actividad

12

LABORATORIO N 13 -"BLOQUEO AVANZADO Y VARIABLES CONDICIONALES"

Figura 16 Captura de pantalla de programa anterior

Responda:
Qu es lo que realiza el programa?

Hace la simulacin del problema del productor-consumidor. Mediante las


funciones mesero, que es el consumidor y hacercomida, que es el productor.
En el programa chefs llama a hacercomida y meseros llama a la funcin
mesero.

Cmo y para qu se esta usando el semforo mtx en el programa?

Se esta utilizando para bloquear y desbloquear hilos dentro del programa.


Qu es std::condition_variable? Para que se usa en el programa?

Es una variable de condicin, la cual administra una lista de subprocesos en


espera hasta que otro hilo les notifique.

13

LABORATORIO N 13 -"BLOQUEO AVANZADO Y VARIABLES CONDICIONALES"

CAPTULO 7

CONCLUSIONES

Vimos como es el bloqueo de funciones en C++, en comparacin con Pascal FC.

Logramos implementar las variables condicionales, con ejemplos como el del


productor/consumidor.

14

LABORATORIO N 13 -"BLOQUEO AVANZADO Y VARIABLES CONDICIONALES"

BIBLIOGRAFA

Cortes, F. (s.f.). Concurrencia - Variables Condicionales. Obtenido de


http://cortesfernando.blogspot.com/2012/02/concurrencia-variablescondicionales.html

Sincronizacin de Hilos POSIX: Variables de Condicin. (s.f.). Obtenido de


http://profesores.elo.utfsm.cl/~agv/elo330/2s11/lectures/POSIX_Threads_Condition
Variables.html

15

Anda mungkin juga menyukai