Prácticas JBACI
Javier García García
Práctica 1 1.
Escribe el p r o g r a m a e n u n fichero, q u e l l a m a r á s E j e m p l o 1 . c m . A c o n t i n u a c i o n ,
edi ta el fich ero y e l i m i n a l a co n st r u c c i on c o b e g i n . S al v a el di rec torio c o n el n o m b r e Ejemplo_serie.cm. C om pi l a a mb os ejemplos.
[Ejemplo1.cm] int n=0; void ContadorEventos(char evento) { int i; for(i=0;i<5;i++) { n = n++; cout << "Evento" << evento << endl; cout << "Cuenta actual:" << n << endl; } } void main() { cobegin { ContadorEventos('a'); ContadorEventos('b'); ContadorEventos('c'); } }
1
Prácticas JBACI
Javier García García
[Ejemplo_serie.cm] i n t n =0 =0 ; v o i d C o n ta t a d o rE r E v e n to t o s ( ch c h a r e v en e n t o) o) { int i; for(i=0;i<5;i++) { n = n++; cou t < < "Evento" < < evento < < endl; cou t < < "Cu en ta actual:" < < n < < endl; } } v oi d m ai n( ) { ContadorEventos('a'); ContadorEventos('b'); ContadorEventos('c');
}
2.
Ejecuta c i nc o
veces
cada
uno
de
los
dos
ejemplos
usando
el
interprete
( b a i n t e r p E j e m p l o 1 _ s e r i e o b a i n t e r p E j e m p l o 1 ) y a l ma m a c en en a l a s a l i d a o b t e n i d a e n l o s f ic i c he h e ro r o s s al a l id i d a_ a _ se s e ri r i e y s al a l id i d a, a , r es e s pe p e ct c t iv i v am a m en e n te t e . C o m e n t a l os o s r es e s ul u l ta t a do d o s o bt b t en e n i do d o s. s. [salida_serie.txt] Eventoa C u e n t a a ct c t u al al : 1 Eventoc C u e n t a a ct c t u al al : 2 Eventob C u e n t a a c tu t u a l: l : E ve v e n to to 4 a C u e n t a a ct c t u al al : 4 2
Prácticas JBACI
Javier García García
Eventoc C u e n t a a ct u al : 6 EventoaEventob C u en t a a ct ua l: C u e n t a a ct u al : 7 7 Eventoc C u e n t a a c tu a l: E ve n to 9 b Eventoa C u e n t a a ct u al : 10 C u e n t a a c tu a l: E ve n to a C u e n t a a ct u al : 12 Eventoc12 C u e n t a a ct u al : 12 Eventob Eventoc C u e n t a a ct u al : 13 C u e n t a a ct u al : 13 Eventob C u e n t a a ct u al : 14 EventoEventoa b C u en t a a ct ua l: 2 Eventoc C u e n t a a ct u al : 2 C u e n t a a c tu a l: E ve n to c C u e n t a a ct u al : 3 3Evento c C u e n t a a ct u al : 4 EventoEventob C u en t a a ct ua l :a C u e n t a a ct u al : 55 Eventoc C u e n t a a c tu a l: E ve n to a C u e n t a a ct u al : 7 7 Eventoc C u e n t a a ct u al : 9 Eventoa C u e n t a a ct u al : 10 3
Prácticas JBACI
Javier García García
Eventob C u e n t a a ct u al : 9 EventoaEventob C u en t a a ct ua l: C u e n t a a ct u al : 11 11 Eventob C u e n t a a ct u al : 12 Eventoc Eventoa C u en t a a ct u al : Cu en t a a ct ua l: 2 2 Eventob C u e n t a a c t u al : 2 E ve n t o Ev e n t oa C u en t a a ct ua l: c C u e n t a a ct u al : 4 4 Eventoa C u e n t a a ct u al : 6 Eventoc C u e n t a a ct u al : 6 EventobEventoc C u e n t a a ct u al : 8 C u e n t a a ct u al : 8 Eventoc C u e n t a a c tu a l: E ve n to b 10 C u e n t a a c tu a l: 1 1E v en t oa C u en t a a ct ua l: 11 Eventob C u e n t a a ct u al : 13 Eventoa C u e n t a a ct u al : 13 Eventob C u e n t a a ct u al : 14 Eventoc C u e n t a a ct u al : 1 EventoEventoc a C u e n t a a ct u al : 2 4
Prácticas JBACI
Javier García García
Eventob C u e n t a a ct u al : 2 C u e n t a a c tu a l: E ve n to c C u e n t a a ct u al : 23 Eventoa C u e n t a a ct u al : 4 Eventob C u e n t a a ct u al : 6 EventoEventoc C u e n t a a ct u al : 7 a C u e n t a a ct u al : 7 Eventob C u e n t a a ct u al : 8 Eventoa C u e n t a a ct u al : 9 EventoEventoc b C u e n t a a ct u al : 11 E v e nt o C ue n t a a c tu a l: a C u e n t a a ct u al : 12 12 Eventob C u e n t a a ct u al : 13 EventobEvento a C u e n t a a ct u al : 2 C u e n t a a c tu a l: E ve n to c C u e n t a a ct u al : 2 2 Eventoa C u e n t a a ct u al : 3 Eventoc C u e n t a a c tu a l: 5 Ev en t o a C u e n t a a ct u al : 5 EventoEventoc b C u e n t a a c tu a l :7 C u en t a a c tu a l: 8 Eventoa C u e n t a a ct u al : 8 Eventob 5
Prácticas JBACI
Javier García García
C u e n t a a ct u al : 9 Eventoc C u e n t a a ct u al : 10 Eventoa C u e n t a a ct u al : 11 Eventoc C u e n t a a ct u al : 12 Eventob C u e n t a a ct u al : 13 Eventob C u e n t a a ct u al : 14
[salida.txt] Eventoc C u e n t a a ct u al : 1 Eventoa C u e n t a a ct u al : 2 Eventob C u e n t a a ct u al : 2 Eventoa C u e n t a a ct u al : 3 EventoEventoa C u e n t a a ct u al : 5 c C u e n t a a ct u al : 5 Eventob C u e n t a a ct u al : 6 Eventoc C u e n t a a ct u al : 7 EventoEventoa C u en t a a ct ua l: c C u e n t a a ct u al : 9 9 Eventob C u e n t a a ct u al : 10 EventoEventoa C u en t a a ct ua l: c C u e n t a a ct u al : 11 11 Eventob C u e n t a a ct u al : 12 Eventob 6
Prácticas JBACI
Javier García García
C u e n t a a ct u al : 13 Eventoa C u e n t a a ct u al : 1 Eventoa C u e n t a a ct u al : 3 Eventob C u e n t a a c tu a l: E ve n to c E v e n to a C ue n t a a c tu a l: 4 C u e n t a a ct u al : 5 5 EventocEventob C u e n t a a c tu a l: E ve n to a C u e n t a a ct u al : 8 8 C u e n t a a ct u al : 8 EventoEventoab C u e n t a a ct u al : 9 C u en t a a ct ua l: 9Eventoc C u en t a a ct ua l: 10 Eventob C u e n t a a c tu a l: E ve n to c C u e n t a a ct u al : 12 12 Eventoc C u e n t a a ct u al : 13 Eventob C u e n t a a ct u al : 14 Eventoc C u e n t a a c tu a l: E ve n to 1 a C u e n t a a ct u al : 2 Eventob C u e n t a a ct u al : 3 EventoEventoa c C u e n t a a ct u al : 4 C u e n t a a ct u al : 4 EventoEventoc C u e n t a a ct u al : 6 7
Prácticas JBACI
Javier García García
Eventob C u en t a a ct ua l :a C u e n t a a ct u al : 77 Eventoc C u e n t a a ct u al : 8 Eventoc C u e n t a a ct u al : 9 EventoEventoa C u e n t a a ct u al : 10 b C u e n t a a ct u al : 10 Eventoa C u e n t a a ct u al : 11 Eventob C u e n t a a ct u al : 12 Eventob C u e n t a a ct u al : 13 Eventob C u e n t a a c tu a l: E ve n to a C u e n t a a ct u al : 11 Evento c C u e n t a a ct u al : 2 EventoEventoc C u en t a a ct ua l :a C u e n t a a ct u al : 44 Eventob C u e n t a a ct u al : 4 Eventoc C u e n t a a ct u al : 5 Eventob Eventoa C u e n t a a ct u al : 7 Eventoc C u e n t a a ct u al : 7 C u e n t a a ct u al : 7 Eventoa C u e n t a a ct u al : 8 EventoEventoc C u en t a a ct ua l :a C u e n t a a ct u al :1 0 10
8
Prácticas JBACI
Javier García García
Eventob C u e n t a a ct u al : 11 Eventob C u e n t a a ct u al : 12 Eventoa C u e n t a a c tu a l: E ve n to c C u e n t a a ct u al : 22 Evento EventoEventoc C u e n t a a ct u al : 3 b C u en t a a ct ua l :a C u e n t a a ct u al : 3 3 EventoEventoc C u e n t a a ct u al : 5 a C u e n t a a ct u al : 5 Eventob C u e n t a a ct u al : 6 EventoEventoa C u e n t a a ct u al : 7 c C u e n t a a ct u al : 7 Eventoa C u e n t a a ct u al : 8 Eventob C u e n t a a ct u al : 8 EventoEventob c C u e n t a a c tu a l :C u en t a a c tu a l: 1 0 10 Eventob C u e n t a a ct u al : 11 3.
Utiliza la construccion
p a ra c o n s e g u i r q ue l a f u n c i o n C o n ta d o r E v e n t o s
s e a u n a c o n s t r u c c i o n a t om ic a. R e p i t e l o s p as os r ea li za d os e n l o s e j em p l os a n t e r i o r e s . C o m e n t a l os r es ul ta do s. [ContadorEventos.cm] i nt n =0 ; a t om i c v o id C on t ad o rE v en t os ( ch a r e ve nt o) 9
Prácticas JBACI
Javier García García
{ i nt i; for(i=0;i<5;i++) { n = n++; cou t < < "Evento" < < evento < < endl; cou t < < "Cu en ta actual:" < < n < < endl; } } v oi d m ai n( ) { cobegin { ContadorEventos('a'); ContadorEventos('b'); ContadorEventos('c'); } }
[salida_Atomic.txt] Eventoc C u e n t a a ct u al : 1 Eventoc C u e n t a a ct u al : 2 Eventoc C u e n t a a ct u al : 3 Eventoc C u e n t a a ct u al : 4 Eventoc C u e n t a a ct u al : 5 Eventob C u e n t a a ct u al : 6 Eventob C u e n t a a ct u al : 7 Eventob C u e n t a a ct u al : 8 Eventob C u e n t a a ct u al : 9 Eventob 10
Prácticas JBACI
Javier García García
C u e n t a a ct u al : 10 Eventoa C u e n t a a ct u al : 11 Eventoa C u e n t a a ct u al : 12 Eventoa C u e n t a a ct u al : 13 Eventoa C u e n t a a ct u al : 14 Eventoa C u e n t a a ct u al : 15 Eventoc C u e n t a a ct u al : 1 Eventoc C u e n t a a ct u al : 2 Eventoc C u e n t a a ct u al : 3 Eventoc C u e n t a a ct u al : 4 Eventoc C u e n t a a ct u al : 5 Eventob C u e n t a a ct u al : 6 Eventob C u e n t a a ct u al : 7 Eventob C u e n t a a ct u al : 8 Eventob C u e n t a a ct u al : 9 Eventob C u e n t a a ct u al : 10 Eventoa C u e n t a a ct u al : 11 Eventoa C u e n t a a ct u al : 12 Eventoa C u e n t a a ct u al : 13 Eventoa C u e n t a a ct u al : 14 Eventoa C u e n t a a ct u al : 15 Eventoc C u e n t a a ct u al : 1 11
Prácticas JBACI
Javier García García
Eventoc C u e n t a a ct u al : 2 Eventoc C u e n t a a ct u al : 3 Eventoc C u e n t a a ct u al : 4 Eventoc C u e n t a a ct u al : 5 Eventob C u e n t a a ct u al : 6 Eventob C u e n t a a ct u al : 7 Eventob C u e n t a a ct u al : 8 Eventob C u e n t a a ct u al : 9 Eventob C u e n t a a ct u al : 10 Eventoa C u e n t a a ct u al : 11 Eventoa C u e n t a a ct u al : 12 Eventoa C u e n t a a ct u al : 13 Eventoa C u e n t a a ct u al : 14 Eventoa C u e n t a a ct u al : 15 Eventoc C u e n t a a ct u al : 1 Eventoc C u e n t a a ct u al : 2 Eventoc C u e n t a a ct u al : 3 Eventoc C u e n t a a ct u al : 4 Eventoc C u e n t a a ct u al : 5 Eventoa C u e n t a a ct u al : 6 Eventoa C u e n t a a ct u al : 7 Eventoa C u e n t a a ct u al : 8 12
Prácticas JBACI
Javier García García
Eventoa C u e n t a a ct u al : 9 Eventoa C u e n t a a ct u al : 10 Eventob C u e n t a a ct u al : 11 Eventob C u e n t a a ct u al : 12 Eventob C u e n t a a ct u al : 13 Eventob C u e n t a a ct u al : 14 Eventob C u e n t a a ct u al : 15 Eventoc C u e n t a a ct u al : 1 Eventoc C u e n t a a ct u al : 2 Eventoc C u e n t a a ct u al : 3 Eventoc C u e n t a a ct u al : 4 Eventoc C u e n t a a ct u al : 5 Eventoa C u e n t a a ct u al : 6 Eventoa C u e n t a a ct u al : 7 Eventoa C u e n t a a ct u al : 8 Eventoa C u e n t a a ct u al : 9 Eventoa C u e n t a a ct u al : 10 Eventob C u e n t a a ct u al : 11 Eventob C u e n t a a ct u al : 12 Eventob C u e n t a a ct u al : 13 Eventob C u e n t a a ct u al : 14 Eventob C u e n t a a ct u al : 15 13
Prácticas JBACI
Javier García García
Práctica 2 1.
I m p l e m e n t e u n a l g o r i t m o q u e i n te n te r e s o l v er el p r o b l e m a d e l a e x c l u s i ó n m u t u a
u t i l i z a n d o l a s o l u c i ó n e r r ó n e a 1 , e s t u d i a d a e n l a e x p o s i c i ó n d e l t e m a ( u t i l i z a n d o d os v a r ia bl es l óg ic as C E A D e n t r o y C EB De nt ro y v er if ic an do el v al or d e e st a s v ar ia bl e s a n t e s d e e n t r a r e n l a s e c c i ó n c r í ti c a) . E j e c u t e el c ó d i g o o bt en di d o c in co v e c e s y c o me n te el r es u lt a do o b t en i d o . {Pract2_1.cm} i nt P 1 D e n t ro , P 2 D e nt r o ; i nt n ; v o i d C o nt E ve n to A () { i nt i; f o r ( i = 0 ; i < 5 ; i ++ ) { w h i le ( P 2D e nt r o= = 1 ); / / I n ic i o d e l a s e c ci ón c r í t i ca P1Dentro=1; n = n++; cout < < "Evento A " < < endl; cout < < "Cuenta actual " < < n < < endl; P1Dentro=0; / / F i n d e l a s e c c i ó n cr í t i c a } } v o i d C o nt E ve n to B () { i nt i; f o r ( i = 0 ; i < 5 ; i ++ ) { while(P1Dentro==1); / / I n i ci o d e l a s ec ci ó n c r í ti c a P2Dentro=1; 14
Prácticas JBACI
Javier García García
n = n++; c o u t < < " E v e n t o B" < < e n d l ; cout < < "Cuenta actual " < < n < < endl; P2Dentro=0; / / F i n d e l a s e c c i ó n cr í t i c a } } v oi d m ai n( ) { P1Dentro=0; P2Dentro=0; cobegin { ContEventoA(); ContEventoB(); } }
2.
H a ga l o m i s m o util izan do la so l uc i ón errónea 2, es decir, u ti li zand o d o s variables
l ó g i c a s C E A Q u i e r e E n t r a r y C E B Q u i e r e E n t r a r y v e r i f i c a n d o el v a l o r d e e st a s v a r i a b l e s d e s p u é s d e a c t u a l i z a r e l v a l o r d e l a v a r i a b l e p r o p i a . C o me n te l o s r e s u l t a d o s d e s p u é s d e c i nc o e je cu ci on es . [Pract2_2.cm] i n t P 1 Q u i e r eE n t r a r ,P 2 Q u i e r eE n t r a r ; i nt n ; v o i d C o nt E ve n to A () { i nt i; f o r ( i = 0 ; i < 5 ; i ++ ) { P1QuiereEntrar=1; w h i l e ( P 2 Qu i e re E n tr a r == 1 ) ; / / I n ic i o d e l a s e c ci ón c r í ti c a
n = n++; cout < < "Evento A " < < endl; 15
Prácticas JBACI
Javier García García
cout < < "Cuenta actual " < < n < < endl; P1QuiereEntrar=0; / / F i n d e l a s e c c i ó n c rí t i c a } } v o i d C o nt E ve n to B () { i nt i; f o r ( i = 0 ; i < 5 ; i ++ ) { P2QuiereEntrar=1; while(P1QuiereEntrar==1); / / I n i ci o d e l a s ec ci ó n c r í ti c a n = n++; c o u t < < " E v e n t o B" < < e n d l ; cout < < "Cuenta actual " < < n < < endl; P2QuiereEntrar=0; / / F i n d e l a s e c c i ó n cr í t i c a } } v oi d m ai n( ) { P1QuiereEntrar=0; P2QuiereEntrar=0; cobegin { ContEventoA(); ContEventoB(); } }
16
Prácticas JBACI 3.
Javier García García
I m p l e m e n t e a h o r a el a l g o r i t m o d e D e k k e r p a r a r e s o l v er el p r o b l e m a . E j ec u t e el
c ó d i g o c in co v e c e s y c om en te l os r es u l ta d o s .
i nt t u r n o ; / / { 1 , 2 }
{ PRIMERO, SEGUNDO}
i nt P 1 Qu i e re E nt r ar , P 2 Q ui e re E nt r ar ; i nt n ; v o i d C o nt E ve n to A () { in t i; f o r ( i = 0 ; i < 5 ; i ++ ) { P1QuiereEntrar=1; w h i l e ( P 2 Qu i e re E nt r a r= = 1 ) { if ( tu rn o= = 2 ) { P1QuiereEntrar=0; w hi le ( t u r n o = = 2 ) ; P1QuiereEntrar=1; } } / / I ni ci o s ec ci on c ri ti ca n = n++; cout < < "Evento A" < < endl; cout < < "Cuenta actual " < < n < < endl; P1QuiereEntrar=0; turno=2; / / F i n s ec ci on c r i t i c a } } v o i d C o nt E ve n to B () { i nt i; f o r ( i = 0 ; i < 5 ; i ++ ) { P2QuiereEntrar=1; while(P1QuiereEntrar==1) 17
Prácticas JBACI
Javier García García
{ if ( tu rn o= = 1 ) { P2QuiereEntrar=0; w h il e ( t u r n o = = 1 ) ; P2QuiereEntrar=1; } } / / I ni ci o s ec ci on c ri ti ca n = n++; c o u t < < " E v e n t o B" < < e n d l ; cout < < "Cuenta actual " < < n < < endl; P2QuiereEntrar=0; turno=1; / / F i n s ec ci on c r i ti c a } } v oi d m ai n( ) { P1QuiereEntrar=0; P2QuiereEntrar=0; turno=1; cobegin { ContEventoA(); ContEventoB(); } }
18
Prácticas JBACI 4.
Javier García García
P a r a t e r m i n a r , i m p l e m e n t e el a l g o r i t m o d e P e t e r s o n , e j e c u t e el c ó d i g o c i n c o
v e c es y c om en te l os r es ul ta do s
[Peterson.cm] i nt t ur no ; / / { 1 , 2 } i nt P 1 Q ui e re E nt r ar , P 2 Q ui e re E nt r ar ; i nt n ; v o i d C o nt E ve n to A () { i nt i; f o r ( i = 0 ; i < 5 ; i ++ ) { P1QuiereEntrar=1; turno=2; w hi le ( ( P2 Qu ie re En tr ar == 1) & & ( tu rn o= =2 ) ) ; / / I ni ci o s ec ci on c ri ti ca n = n++; cout < < "Evento A " < < endl; cout < < "Cuenta actual " < < n < < endl; P1QuiereEntrar=0; / / F i n s ec ci on c r i ti c a } } v o i d C o nt E ve n to B () { i nt i; f o r ( i = 0 ; i < 5 ; i ++ ) { P2QuiereEntrar=1; turno=1; w hi le ( ( P1 Qu ie re En tr ar == 1) & & ( tu rn o= =1 ) ) ; / / I ni ci o s ec ci on c ri ti ca n = n++; c o u t < < " E v e n t o B" < < e n d l ; cout < < "Cuenta actual " < < n < < endl; P2QuiereEntrar=0; 19
Prácticas JBACI
Javier García García
/ / F i n s ec ci on c r i ti c a } } v oi d m ai n( ) { P1QuiereEntrar=0; P2QuiereEntrar=0; turno=1; cobegin { ContEventoA(); ContEventoB(); } }
20
Prácticas JBACI
Javier García García
Práctica 3 1.
El pr o c eso pr od u ct or g enera rá n ú m er o s d e 100 en 100. Estos n ú m er o s tienen q u e
c o l o c ar s e e n u n a r r a y d e e n t e r o s ( r e c u r s o c om pa rt id o) d e t a m a ñ o 1 0 ( es d e c i r , p ue de h a b e r u n m á x i m o d e 1 0 n u m er o s d i s t i n t o s e n el b u f f e r ) . E l p r o c e s o c o n su m id o r t o m ar á l os n ú m er os d el b u f f e r y l os m os tr ar á e n p an ta ll a. I mp l em en te m ed ia nt e s em áf or os u n a s ol uc i ó n a l p r ob l em a p re se nt ad o. {Productor_Consumidor.cm} int pos;
//Variable posición
s e m a ph or e l l en o= 10 ;
/ /S e m a f o r o ll e n o, m a x 10 el e m e n t o s .
binarysem s=1;
//Semaforo binario
semaphore vacio=0;
//Semaforo vacio
int vector[10];
//Buffer máximo de 10
void insertar(int i)
//Funcion que inserta un elemento el vector
{ vector[pos]=i; pos++; } int coger()
//Función que recoge un elemento de vector
{ pos--; return vector[pos]; } void Productor()
//Función Productor()
{ int i,numero; while(1) { for(i=0;i<100;i++) { wait(lleno);
//Espera si está lleno
numero=random(100); wait(s);
//Espera a poder entrar al vector
insertar(numero); signal(s);
//Salida de la sección crítica
signal(vacio);
//Al insertar un elemento enviamos señal
} 21
Prácticas JBACI
Javier García García
} } void Consumidor()
/ /Func ión Consu midor()
{ while(1) { wait(vacio);
//Espera a que no esté vacío
wait(s);
//Espera a poder entrar al vector
cout<< coger()<< endl; signal(s);
//Salida de la sección crítica
signal(lleno); } } void main() { cobegin { Productor(); Consumidor(); } }
22
Prácticas JBACI
Javier García García
Práctica 4 1.
Implemente, u s a n d o la con strucción atom ic , la instrucción TSL. Utilícela p a r a
r e s o l v e r el p r ob le m a d e e x c l u s i ó n m ut u a q u e se p l a n t e o p ar a r es o l v e r el p ro b le m a d e e x c l u s i ó n m ut ua d e l a p r á c t i c a 1 . A c o n t i n u a c i ó n , i m p l e m e n t e l a s f u n c i o n e s w a i t ( ) y s i g na l () d e l os s em af or os , c o n n o m b r es e s p e r a () y s i gu e( ) u ti li za nd o l a i ns t r u c ci ó n T S L . R eh a g a l a p r á c t i c a tres u s a nd o l a s c o n s t r u c c i o n e s a n t e r i o r m e n t e i m p l e m e n t a d a s , c o m p r o b a n d o q u e f u nc i on a n c or re ct am en te . / * V ar ia bl es g l ob a le s* /
t yp ed ef i nt s e ma f o ro [ 2 ]; / /L a es t r u c t u r a S em af or o es u n t i p o d e d at o c om pu es to d e d o s c a m p o s //
C o n t a d o r d e procesos [0]
//
Identificador d e proceso [1]
i nt v e ct o r[ 1 0] ; i nt p o s ; s e ma f or o l le no ; s e ma f or o v ac i o; s em a f o r o s; i nt c e rr o jo ;
/ * E st r uc t ur a T SL * / a to m i c in t T SL (i nt & i ) { if ( i= =0 ) { i=1; r et ur n 1 ; } else { r et ur n 0 ; } } / * F u nc i on E s p e r a * / v o i d e sp e ra ( se m af o ro & s) { i nt m _ c o n t p r o c ;
/ / U s a m o s u n a v a r i a b l e t e m p o r a l p u e s t o q u e el a c c e s o a l a 23
Prácticas JBACI
Javier García García
estructura / / se m af o ro n o f u nc i on a c or re ct am en te while(!TSL(cerrojo));
//Espera im pr odu ct iv a h asta q u e se a b r a / / .. . S e cc i on c ri ti ca
m_contproc=s[0]; m_contproc--;
//Decrementamos el c ontador
s[0]=m_contproc; cerrojo=0;
/ / . . . F i n S e c c i o n c r i ti c a
c o u t < < " \ n E s p e r a n d o . . . [" m _ co n tp r oc < < "]" < < e n d l ; if(m_contproc<0)
/ / S i el c o n t a d o r es m e n o r d e 0
{ s[1]=which_proc();
/ / A l m a c e n a r el p r o c e s o
c o u t < < " \ n S u s p e n d i d o . . . [" s [ 1 ] < < "]" < < e n d l ; suspend();
//Suspenderlo
}
}
/ * F un ci on S ig ue */ v o i d s i gu e (s em a fo r o& s) { i nt m _ c o n tp r o c ; while(!TSL(cerrojo));
//Espera improductiva hasta qu e entremos / / .. . S e cc i on c ri ti ca
m_contproc=s[0]; m_contproc++;
/ / I n c r e m e n t a m o s el c o n t a d o r
s[0]=m_contproc; cerrojo=0; if(m_contproc>=0)
/ / . . . F i n S e c c i o n c r i ti c a / / S i el c o n t a d o r e s m a y o r q u e 0
{ c ou t < < " / n P ro ce so r e v i v i d o . . . " < < m _ c on t p r o c < < e n dl ; revive(s[1]);
//Revivimos
} }
24
Prácticas JBACI v o i d i n s ert a r( i n t i )
Javier García García / / I n s e r t a m o s u n e l e m e n t o e n el v e c t o r
{ vector[pos]=i; pos++; } i nt c o g e r ( )
/ / R e c o g e m o s u n e l e m e n t o e n el v e c t o r
{ i nt a ux ; pos--; a u x = v ec to r[ po s] ; vector[pos]=0;
/ / A l recoger el valor del vector l o d e j a m o s a 0
r et ur n a u x ; } v o i d P ro du c to r( ) { i nt i , n um e r o; while(1) { for(i=0;i<100;i++) { espera(lleno);
/ / E s p e r a m o s si e st a l l e n o
numero=random(100); espera(s);
//Generamos un numero
/ / E n t r a d a e n l a z o n a c ri t i c a
insertar(numero); sigue(s); sigue(vacio);
/ / S a l i d a z o n a c ri t i c a //Señal de qu e y a n o_ v a c i o
} } } v o i d C o n su m i d or ( ) { while(1) { espera(vacio); espera(s);
/ / E s p e r a m o s si es v a c i o / / E n t r a d a a l a z o n a c ri t i c a
c o u t< < c og er ( ) << e nd l; sigue(s);
/ /Sali da d e z o n a c ritica 25
Prácticas JBACI
Javier García García
sigue(lleno); } } v oi d m ai n( ) { / / I ni c i al i za m os l as v ar i ab l es l le n o[ 0 ] = 1 0 ; vacio[0] = 0;
/ / E s t a va c i o
s[0] = 1;
/ /N o hay nadie accediendo
cerrojo=0;
/ / C e r r o j o es t a l i b r e
pos=0;
/ / P o s a ctual d el v ector
cobegin { Productor(); Consumidor(); } }
26
Prácticas JBACI
Javier García García
Práctica 5 1.
Repita la práctica 3 utilizando monitores en lugar de semáforos.
m on it or b uf fe r_ li mi ta do
/ / D ec la ra ci ón d el m on it or
{ const int N=10;
//Tamaño del buffer
int buffer[N]; int sigent,sigsal; int contador; condition no_lleno,no_vacio;
void poner(int x)
//Funcion que coloca x en el buffer
{ if (contador==N) { waitc(no_lleno); } buffer[sigent]=x; sigent=(sigent+1)%N; contador++; signalc(no_vacio); } int coger()
//Funcion que recoge del buffer un elemento
{ int x; if (contador==0) { waitc(no_vacio); } x=buffer[sigsal]; sigsal=(sigsal+1)%N; contador--; signalc(no_lleno); r et u r n x;
//Devolvemos el valor
} i nit
//Funcion de inicialización
{ sigent=0; 27
Prácticas JBACI
Javier García García
sigsal=0; contador=0; } }
void Productor() { int i,numero; while(1) { for(i=0;i<100;i++) { numero=random(100);
//Generamos un numero aleatorio
poner(numero);
//Usamos el monitor
} } }
void Consumidor() { int numero; while(1) { numero=coger();
//Usamos la propiedad del monitor
cout<< numero<< endl; } } void main() { cobegin { Productor(); Consumidor(); } }
28