with Stringpack; use Stringpack;
procedure Shared_Demo2 is

N: Integer := 0; --shared variable
Anz: Positive := 1_000_000;

TURN: POSITIVE range 1..2;
FLAG1, FLAG2: BOOLEAN := FALSE;
pragma ATOMIC(TURN); --sicher ist sicher
pragma ATOMIC(FLAG1);
pragma ATOMIC(FLAG2);

task Up;
task body Up is
   My_N: Integer;
begin
   for I in 1..Anz loop
      FLAG1 := TRUE;
      TURN := 1;
      while FLAG2 and TURN = 1 loop null; end loop;
      My_N := N;
      My_N := My_N+1;
      N := My_N;
      FLAG1 := FALSE;
   end loop;
end Up;

task Down;
task body Down is
   My_N: Integer;
begin
   for I in 1..Anz loop
      FLAG2 := TRUE;
      TURN := 2;
      while FLAG1 and TURN = 2 loop null; end loop;
      My_N := N;
      My_N := My_N-1;
      N := My_N;
      FLAG2 := FALSE;
   end loop;
end Down;

begin
   while not(Up'Terminated and Down'Terminated) loop
      null;
   end loop; -- sehr schlechter Stil !!!!!!!!!!!!!!!

   Print("n= " & N);
end Shared_Demo2;

