exam 7
-
Upload
miguelibarra -
Category
Documents
-
view
2 -
download
0
description
Transcript of exam 7
7/21/2019 exam 7
http://slidepdf.com/reader/full/exam-7-56d86ee58616f 1/13
Benemérita Universidad Autónoma
del Estado de Puebla
Facultad de Cs. De la Computación
Programación Concurrente y Paralela
Lectores - Escritores
Profr:
María del Carmen Cerón Garnica
Alumnos:
Roberto Alejandro ra!o Arredondo
Aldo "lores A#aricio
Matricula:
$%%&$'$(&
$%%&)'))'
$* de no!iembre de $%++
LEC,RE. / E.CR0,RE.
Problema de los Lectores y Escritores
El problema de los lectores y los escritores modela el acceso a un BD.Se puede aceptarque varios procesos lean de la BD al mismo tiempo, pero si uno de los procesos está
7/21/2019 exam 7
http://slidepdf.com/reader/full/exam-7-56d86ee58616f 2/13
escribiendo (modificando) la BD, ninuno de los demás procesos deber!a tener acceso a
esta, ni siquiera los lectores.
.incroni1aci2n
public class "estEscLec #
public static void main(Strin$% ars)#
&ontrolador c 'ne &ontrolador()
**prioridad a los lectores
Lector lec
for(int i'+ i- i)#
lec ' ne Lector(c,i)
lec.start()
/
Escritor esc ' ne Escritor(c)
esc.start()
try #
"0read.sleep((int)(1at0.random()23+++))
/ catc0 (E4ception e) #
System.out.println(e)/
System.e4it(+)
/
/
public class Lector e4tends "0read#
private &ontrolador controlador
private int id
public Lector(&ontrolador c, int id)#
controlador ' c
t0is.id ' id
/
**pasa un tiempo 0aciendo otra cosa
public void otra&osa()#
try #
"0read.sleep((int)(1at0.random()2-++))
/ catc0 (E4ception e) #
System.out.println(e) /
/
public void run() #
do #controlador.entraLectorBD()
7/21/2019 exam 7
http://slidepdf.com/reader/full/exam-7-56d86ee58616f 3/13
otra&osa() **pasa un tiempo
/ 0ile (true)
/
/
public class Escritor e4tends "0read# private &ontrolador controlador
private int id
public Escritor(&ontrolador b)#
controlador ' b
/
**piensa que escribir
public void pensando()#
try #
"0read.sleep((int)(1at0.random()25++))/ catc0 (E4ception e) #
System.out.println(e) /
/
public void run() #
0ile(true) #
controlador.entraEscritorBD()
pensando() **pasa tiempo
/
/
/
public class &ontrolador#
private int lectores **numero de lectores que están leyendo la BD
private boolean turnoLectores
private boolean turnoEscritores
public &ontrolador ()#
lectores ' +
turnoLectores ' true **priodidad lectores
turnoEscritores ' false/
public sync0roni6ed void entraLectorBD()
#
0ile(turnoEscritores)#
try #
ait() ** dar prioridad al escritor
/ catc0 (E4ception e) #System.out.println(e)/
/
**pasa a leer
7/21/2019 exam 7
http://slidepdf.com/reader/full/exam-7-56d86ee58616f 4/13
lectores
System.out.println(7Lector leyendo en BD7)
**pasa un tiempo leyendo
try #
"0read.sleep((int)(1at0.random()25++))
/ catc0 (E4ception e) # System.out.println(e)/ System.out.println(7Lector sale de BD7)
lectores88
if(lectores '' +)
#
turnoLectores ' false
notify() **al escritor
/
/
public sync0roni6ed void entraEscritorBD()
#
turnoEscritores ' true **solicita entrar
0ile(turnoLectores)#
try #
ait() ** espera por entrar
/ catc0 (E4ception e) #System.out.println(e)/
/
**pasa a escribir
System.out.println(7Escritor escribiendo en la BD7)
try #
"0read.sleep((int)(1at0.random()29++))
/ catc0 (E4ception e) #
System.out.println(e)/
System.out.println(7Escritor sale de BD7)
turnoEscritores ' false
turnoLectores ' true
lectores ' + **iniciali6a contador lectores
notify:ll()
//
7/21/2019 exam 7
http://slidepdf.com/reader/full/exam-7-56d86ee58616f 5/13
.em3foros
class BD #
private int valor ' +
public BD (int v) #
valor ' v
/
public int leer (int i) #System.out.println (7Lector 7i7 leyendo7)
try #"0read.sleep (5++)/
catc0 (E4ception e) #/
System.out.println (7Lector 7i7 leyendo7)
try #"0read.sleep (5++)/
catc0 (E4ception e) #/
System.out.println (7Lector 7i7 leyendo7)
return valor
/
public void escribir (int v, int i) #
7/21/2019 exam 7
http://slidepdf.com/reader/full/exam-7-56d86ee58616f 6/13
System.out.println (7Escritor 7i7 escribiendo7)
System.out.println (7Escritor 7i7 escribiendo7)
System.out.println (7Escritor 7i7 escribiendo7)
valor ' v
/
/
class &omun #
protected static int lectores ' +
protected static SemaforoBinario mute4 ' ne SemaforoBinario (5)
protected static SemaforoBinario escritores ' ne SemaforoBinario (5)
protected static BD bd ' ne BD(+)
/
class Escritor e4tends &omun implements ;unnable #
private int i
public Escritor (int <i) #i'<i
/
public void run () #
for (int ='+=-=) #
System.out.println (7Escritor 7i7 quiere escribir7)
escritores.>:?"()
bd.escribir (i,i)
escritores.S?@A:L()
/
/
/
class Lector e4tends &omun implements ;unnable #
private int i
public Lector (int <i) #
i'<i
/
public void run () #for (int ='+ =- =) #
System.out.println (7Lector 7i7 quiere leer7)
mute4.>:?"()
lectores
if (lectores '' 5)
escritores.>:?"()
mute4.S?@A:L()
bd.leer (i)
mute4.>:?"()
lectores88
if (lectores '' +)escritores.S?@A:L()
7/21/2019 exam 7
http://slidepdf.com/reader/full/exam-7-56d86ee58616f 7/13
mute4.S?@A:L()
System.out.println (7Lector 7i7 usa su dato7)
/
/
/
class SemaforoBinario #
protected int contador ' +
public SemaforoBinario (int valor?nicial) #
contador ' valor?nicial
/
sync0roni6ed public void >:?" () #
0ile (contador '' +)
try #
ait()/
catc0 (E4ception e) #/
contador88
/
sync0roni6ed public void S?@A:L () #
contador ' 5
notify()
/
/
public class SemLectoresEscritores #
public static void main (Strin ars$%) #
for (int i'+ii)
ne "0read (ne Escritor (i)).start()
for (int i'+ii)
ne "0read (ne Lector (i)).start()
/
/
7/21/2019 exam 7
http://slidepdf.com/reader/full/exam-7-56d86ee58616f 8/13
7/21/2019 exam 7
http://slidepdf.com/reader/full/exam-7-56d86ee58616f 9/13
Monitores
public class BaseDatos #
private int valor ' +
public BaseDatos(int v) #
valor ' v/
public int leer(int i) #
System.out.println(7Lector 7i7 leyendo7)
try #"0read.sleep(++)/
catc0 (E4ception e) #/
System.out.println(7Lector 7i7 leyendo7)
System.out.println(7Lector 7i7 leyendo7)
return valor
/
public void escribir(int v, int i) #
System.out.println(7Escritor 7i7 escribiendo7)
System.out.println(7Escritor 7i7 escribiendo7)
System.out.println(7Escritor 7i7 escribiendo7)
valor ' v
/
/
public class &ontroladorPrefLectores #
int contadorLectores ' +
boolean 0ayEscritor ' false
&C9 o"o>rite ' ne &C9(7o"o>rite7)
&C9 o"o;ead ' ne &C9(7o"o;ead7)
public &ontroladorPrefLectores() #
/
public sync0roni6ed void empe6arLectura(int i) #
0ile(0ayEscritor) #
System.out.println(7el lector 7i7 se queda bloqueado en el
monitor7) o"o;ead.DEL:(t0is)
/
contadorLectores
o"o;ead.;ESF1E(t0is)
/
public sync0roni6ed void terminarLectura(int i) #
contadorLectores 88
if(contadorLectores '' +)
o"o>rite.;ESF1E(t0is)
/
7/21/2019 exam 7
http://slidepdf.com/reader/full/exam-7-56d86ee58616f 10/13
public sync0roni6ed void empe6arEscritura(int i) #
0ile(0ayEscritor GG (contadorLectores H' +)) #
System.out.println(7el escritor 7 i 7 se queda bloqueado en el
monitor7)
o"o>rite.DEL:(t0is)
/0ayEscritor ' true
/
public sync0roni6ed void terminarEscritura(int i) #
0ayEscritor ' false
if(Ho"o;ead.E1P"(t0is))
o"o;ead.;ESF1E(t0is) **damos preferencia a lectores
else
o"o>rite.;ESF1E(t0is)
/
/
import =ava.util.Cector
public class &C9 #
Cector bloqueados
boolean condSalida
Strin nombre
static Cector condicion
public &C9(Strin <nombre) #
nombre ' <nombre
condSalida ' false
bloqueados ' ne Cector(+)
condicion ' ne Cector(5+)
/
public void DEL:(Ib=ect monitor) #
sync0roni6ed(monitor) #
try #
bloqueados.addElement ("0read.current"0read())do #
monitor.ait()
condSalida ' bloqueados.firstElement().equals
("0read.current"0read()) JJ condicion.contains
(nombre)
if(HcondSalida) monitor.notify()
/
0ile(HcondSalida)condSalida ' false
7/21/2019 exam 7
http://slidepdf.com/reader/full/exam-7-56d86ee58616f 11/13
bloqueados.removeElement("0read.current"0read())
condicion.removeElement(nombre)
/ catc0(E4ception e) #e.printStac"race()/
/
/
public void ;ESF1E(Ib=ect monitor) #
sync0roni6ed(monitor) #
if(bloqueados.si6e() K +) #
condSalida ' false
if(Hcondicion.contains(nombre))
condicion.addElement (nombre)
monitor.notify()
return
/
/
/
public boolean E1P"(Ib=ect monitor) #
sync0roni6ed(monitor) #
if(bloqueados.si6e() K +) return false
else return true
/
/
/
public class Escritor implements ;unnable #
private int i
BaseDatos bd
&ontroladorPrefLectores controlador
public Escritor(BaseDatos <bd, &ontroladorPrefLectores <controlador, int <i) #
i '<i
bd ' <bd
controlador ' <controlador
/
public void run() #for(int ='+=-=) #
System.out.println(7Escritor 7i7 quiere escribir7)
controlador.empe6arEscritura(i)
bd.escribir(i,i)
controlador.terminarEscritura(i)
System.out.println(7Escritor 7i7 usa su dato7)
/
/
/
public class Lector implements ;unnable # private int i
7/21/2019 exam 7
http://slidepdf.com/reader/full/exam-7-56d86ee58616f 12/13
BaseDatos bd
&ontroladorPrefLectores controlador
public Lector(BaseDatos <bd, &ontroladorPrefLectores <controlador, int <i) #
i'<i
bd ' <bdcontrolador ' <controlador
/
public void run() #
for(int ='+=-=) #
System.out.println(7Lector 7i7 quiere leer7)
controlador.empe6arLectura(i)
bd.leer(i)
controlador.terminarLectura(i)
System.out.println(7Lector 7i7 usa su dato7)
//
/
public class 1onLectoresEscritores #
static BaseDatos bd ' ne BaseDatos(+)
static &ontroladorPrefLectores controlador ' ne &ontroladorPrefLectores()
public static void main(Strin ars$%) #
for(int i'+ii)
ne "0read(ne Lector(bd, controlador, i)).start()
for(int i'+ii)
ne "0read(ne Escritor(bd, controlador, i)).start()
/
/
7/21/2019 exam 7
http://slidepdf.com/reader/full/exam-7-56d86ee58616f 13/13