Issues in Ada Concurrency
        Posted  
        
            by Arkapravo
        on Stack Overflow
        
        See other posts from Stack Overflow
        
            or by Arkapravo
        
        
        
        Published on 2010-03-22T16:14:31Z
        Indexed on 
            2010/03/23
            21:13 UTC
        
        
        Read the original article
        Hit count: 422
        
Hi
I need some help and also some insight. This is a program in Ada-2005 which has 3 tasks. The output is 'z'. If the 3 tasks do not happen in the order of their placement in the program then output can vary from z = 2, z = 1 to z = 0 ( That is easy to see in the program, mutual exclusion is attempted to make sure output is z = 2).
WITH Ada.Text_IO; USE Ada.Text_IO;
WITH Ada.Integer_Text_IO; USE Ada.Integer_Text_IO; 
WITH System; USE System;
procedure xyz is 
   x : Integer := 0; 
   y : Integer := 0; 
   z : Integer := 0;
   task task1 is
      pragma Priority(System.Default_Priority + 3);
   end task1;
   task task2 is
      pragma Priority(System.Default_Priority + 2);
   end task2;
   task task3 is
      pragma Priority(System.Default_Priority + 1);
   end task3;
   task body task1 is
   begin
      x := x + 1;
   end task1;
   task body task2 is
   begin
      y := x + y;
   end task2;
   task body task3 is
   begin
      z := x + y + z;
   end task3;
begin 
   Put(" z = ");
   Put(z); 
end xyz;
I first tried this program
(a) without pragmas, the result : In 100 tries, occurence of 2: 86, occurence of 1: 10, occurence of 0: 4.
Then
(b) with pragmas, the result : In 100 tries, occurence of 2: 84, occurence of 1 : 14, occurence of 0: 2.
Which is unexpected as the 2 results are nearly identical. Which means pragmas or no pragmas the output has same behavior.
Those who are Ada concurrency Gurus please shed some light on this topic. Alternative solutions with semaphores (if possible) is also invited.
Further in my opinion for a critical process (that is what we do with Ada), with pragmas the result should be z = 2, 100% at all times, hence or otherwise this program should be termed as 85% critical !!!! (That should not be so with Ada)
© Stack Overflow or respective owner