Nothing Special   »   [go: up one dir, main page]

Hyman y Eisenberg

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 9

UNIVERSIDAD NACIONAL JORGE BASADRE GROHMANN

FACULTAD DE INGENIERÍA

ASIGNATURA: Algoritmos y Programación paralela


TEMA: LABORATORIO
ESTUDIANTE: YAHIR SERGIO CHOQUEHUANCA CHIPANA
CÓDIGO DE ESTUDIANTE: 2021-119014

TACNA - PERÚ
2022
Algoritmo Hyman en Pascal:

Ejecución:
Código fuente:

program hyman;

VAR flag1,flag2: boolean;


var turno:integer;
var suma:integer;

PROCESS P0;
BEGIN
REPEAT
flag1:=true;
WHILE turno<>1 do
BEGIN
WHILE flag2=true do NULL;
turno:=1;
END;
suma:=suma+1;
WriteLn('Turno1 - ',suma);
flag1:=false;
FOREVER
END;

PROCESS P1;
BEGIN
REPEAT
flag2:=true;
WHILE turno<>2 do
BEGIN
WHILE flag1=true do NULL;
turno:=2;
END;
suma:=suma+1;
WriteLn('Turno2 - ',suma);
flag2:=false;
FOREVER
END;

BEGIN (*main program*)


flag1:=false;
flag2:=false;
turno:=1;
suma:=0;
COBEGIN P0;P1 COEND
END.
Algoritmo Hyman en c++:

Ejecución:
Código fuente:
#include <iostream>
#include <thread>
using namespace std;

bool flag1,flag2;
int suma,turno;

void P0(){
while(true){
flag1=true;
while(turno!=1){
while(flag2==true){
}
turno=1;
}
suma=suma+1;
cout<<"\nTurno 1 - : "<<suma;
flag1=false;
}
}

void P1(){
while(true){
flag2=true;
while(turno!=2){
while(flag1==true){
}
turno=2;
}
suma=suma+1;
cout<<"\nTurno 2 - : "<<suma;
flag2=false;
}
}

int main(){
flag1=false;
flag2=false;
turno=1;
suma=0;
thread t1(P0);
thread t2(P1);
t1.join();
t2.join();
return 0;
}
Algoritmo Eisenberg en Pascal:
Ejecución:
Código fuente:
program eisenberg;
const n = 3;
var turno, suma,aux : integer;
var indicador: array[0..n] of integer;

PROCESS type Proceso( i:integer);


var j: integer;
BEGIN
REPEAT
REPEAT
indicador[i]:=1;
j:=turno;
while(j<>i) do
begin
if indicador[j]<>3 then j:=turno
else j:=(j+1) mod n;
end;
indicador[i]:=2;
j:=0;
while (j<n) and((j=i) or (indicador[j]<>2)) do
j:=j+1;
until ((j>=n) and ((turno=i) or
(indicador[turno]=3)));
turno:=i;
(*seccion critica *)
suma:=suma+1;
WriteLn('Turno[',i,'] - ',suma);
j:=(turno+1) mod n;
while indicador[j]=3 do j:=(j+1) mod n;
turno:=j;
indicador[i]:=3;
forever
END;

var proc : array[0..n] of Proceso;

begin
for aux := 0 to n do indicador[aux]:=3;
turno := random(n);
suma:=0;

COBEGIN

for aux := 0 to n do proc[aux](aux);


COEND
end.
Algoritmo Eisenberg en c++:
Ejecución:
Código fuente:
#include <iostream>
#include <thread>
using namespace std;
const int n = 3;
int turno,suma,aux;
int indicador[n];

void Pi(int i){


int j;
while(true){
indicador[i]=1;
j=turno;
while(j!=i){
if(indicador[j]!=3){
j=turno;
}else{
j=(j+1)%n;
}
}
indicador[i]=2;
j=0;
while(j<n&&(j==i||indicador[j]!=2)){
j=j+1;
}
if((j>=n)&&(turno==i||indicador[turno]==3)){
turno=i;
suma=suma+1;
cout<<"\nTurno ["<<i<<"] - "<<suma;
j=(turno+1)%n;
while(indicador[j]==3){
j=(j+1)%n;
}
turno=j;
indicador[i]=3;
}
}
}

int main(){
int i;
for(i=0;i<n;i++){
indicador[i]=3;
}
turno=0;
suma=0;
thread t1(Pi,0);
thread t2(Pi,1);
thread t3(Pi,2);
t1.join();
t2.join();
t3.join();
return 0;
}

También podría gustarte