Ejercicio 11

Ejercicio 11

de Joel Cabrera Dechia -
Número de respuestas: 7

Buenas!
Cómo va?

Hay dos cosas que me hacen ruido de la solución que implementé y que me gustaría preguntar.

Primero pregunto si es posible acceder a cada gusto disponible.
Implementé un array gustos de 20 elementos del task type GUSTO, donde en cada uno asigno un numero que lo identifica y el gusto asociado en el programa principal. El tema es que acá asumí que en g tengo todos los gustos, y no se si puedo.
--PROGRAMA PRINCIPAL
gustos: array(20) of GUSTO;
...
i: integer;
g: array(20) of gusto --MINUSCULA PUES SON TODOS LOS GUSTOS, NO LAS TASKS
begin
    for i:=0 to 19 do
        gustos[i].ASIGNAR(i,g[i]);
    end for;
    ...
end;

La otra pregunta es sobre el armado de helados.

Implementé un task auxiliar llamado HELADERIA que actua como administador que asigna clientes a vendedores:
task body HELADERIA is
begin
    loop
        select
            accept pedir_vendedor(v_asignado: out integer) do
                accept pedir_cliente(idV: in integer);
                v_asignado := idV;
            end pedir_vendedor;
        end select;
    end loop;
end HELADERIA;

En el momento de que se asigna un cliente a un vendedor, este inicializa una cola de 0 a 19, y va viendo de que gusto es el helado con indice frente de la cola con el objetivo de identificar el TASK asociado al gusto pedido. Separo en dos casos:

  • Si alguien ya esta utilizando ese gusto, no se podra fijar de que gusto es, por lo que desencola y encola nuevamente ese numero para chequearlo luego.
  • Si no están utilizando ese gusto, entonces se fija si es el gusto buscado y, en caso de serlo, devuelve true y termina la iteración, poniendose a armar el helado.
    task body VENDEDOR is
        mi_id,i: integer;
        C: Cola;
    begin
    ...--asignacion de id y pedido de cliente
    accept PEDIR(g: in gusto) do
                    inicializar_cola(C,20);
                    encontre:=false;
                    while not encontre do
                        frente(C,i);
                        select
                            gustos[i].obtener_helado(g,encontre);
                            desencolar(i);
                        else:
                            desencolar(i);
                            encolar(i);
                        end select;
                    end while;
                    entregar_o_recibir_helado();
    end PEDIR;
    ...
    end VENDEDOR;
Agradezco me digan si está bien lo que pensé o por dónde debería agarrar.

Saludos,
Joel

En respuesta a Joel Cabrera Dechia

Re: Ejercicio 11

de Joel Cabrera Dechia -
Buenas,
Todo bien?

Me acabo de dar cuenta que queda en busy waiting pidiendo a cada rato si lo encontró.
Igualmente para poder seguir, agradezco me respondan lo de los gustos, si puedo acceder a todos ellos para identificarlos.

Saludos,
Joel
En respuesta a Joel Cabrera Dechia

Re: Ejercicio 11

de Federico Rivero -
Hola Joel,

Sí, tenés que de alguna manera modelar los gustos y cuál está siendo usado. Tiene sentido que en algún momento tengas que tener algún arreglo que represente los gustos. Si ese arreglo son tasks o booleanos ya es parte del ejercicio.

Saludos,
Federico
En respuesta a Federico Rivero

Re: Ejercicio 11

de Joel Cabrera Dechia -
Buenas,

No me refería a eso, sino a cómo puedo identificar los gustos, ya que la funcion que_gusto me devuelve algo de tipo gusto, no un entero, por lo que no puedo hacer un array de indice lo que devuelva esa función. Para lo que quiero hacer (que es como un mapeo) debería saber cuales son todos los posibles gustos que devuelve esa función, y a eso iba la pregunta, cómo sé cuáles son los elementos de tipo gusto y si puedo acceder a ellos.

Saludos,
Joel
En respuesta a Joel Cabrera Dechia

Re: Ejercicio 11

de Diego Ismael Marichal Chavez -
Buenas, yo tengo una version de la solucion y queria saber si esta correcta



Saludos
Diego
En respuesta a Diego Ismael Marichal Chavez

Re: Ejercicio 11

de Federico Rivero -
Hola Diego!

Ojo que ahí tenés un busy waiting en 'pedir'. Las soluciones con busy waiting no son aceptables en ninguno de los ejercicios de concurrencia.

Saludos,
Federico
En respuesta a Federico Rivero

Re: Ejercicio 11

de Diego Ismael Marichal Chavez -
Gracias por la respuesta, para solucionar eso se me ocurre que cuando el cliente recibe el helado, le haga un aviso al vendedor, indicándole que el gusto ya le fue servido, es raro ya que el cliente le avisa al vendedor, pero no veo ninguna restriccion por parte de la letra, y ademas no estoy seguro si es posible que un vendedor haga un llamado de la funcion aviso de otro vendedor
Saludos
Diego