通过不同的任务同时访问一个任务的两个条目

时间:2015-05-13 13:07:18

标签: multithreading task ada

我需要通过两个不同的任务访问一个任务的两个不同条目。看起来我对Ada的了解不足以执行此操作,我也花了很多时间寻找解决方案,但没有任何影响。我尝试使用受保护的类型作为管理器,但它不起作用。我希望我的访问任务在每个条目中将计数器递增1,然后在计数器达到2后在第一个条目中执行更多的工作。我的方法是这样的

  task mainTask is
      entry first(n : in Integer);
      entry second(n : in Integer);
  end mainTask;
  task body mainTask is
      counter : Integer := 0;
  begin
  loop
     accept first(n : in Integer) do
        loop
           counter := counter + 1;
           Put_Line("First one working");
           --loop and wait until counter is 2
           --perform rest of the code
           delay 1.0;
        end loop;
     end first;
     accept second(n : in Integer) do
        loop
           counter := counter + 1;
           Put_Line("Second one working");
           delay 1.0;
        end loop;
     end second;
  end loop;
end mainTask;

task firstTask;
task body firstTask is
begin
   mainTask.first(0);
end firstTask;

task secondTask;
task body secondTask is
begin
   mainTask.second(0);
end secondTask;

运行firstTask后,访问第一个条目并进入无限循环,第二个条目无法访问第二个条目。我知道它为什么会发生,但我想不出可行的东西。 也许有一些像接受第一(...)和接受第二(...)。 提前谢谢!

2 个答案:

答案 0 :(得分:1)

如果你真的想要"一台机器(任务)需要两个工人(工人是一系列任务),你可以同时按下两个不同的按钮,这样机器就可以做一些“,如在您对我的评论的回复,你可以考虑在你的代码中明确这一点;

之类的东西
task body Main is
begin
   loop
      select
         accept First_Button_Pressed;
         select
            accept Second_Button_Pressed;
            Put_Line ("second pressed while first pressed");
         or
            accept First_Button_Released;
            Put_Line ("first released");
         or
            terminate;
         end select;
      or
         accept Second_Button_Pressed;
         select
            accept First_Button_Pressed;
            Put_Line ("first pressed while second pressed");
         or
            accept Second_Button_Released;
            Put_Line ("second released");
         or
            terminate;
         end select;
      or
         accept First_Button_Released;
         Put_Line ("first released");
      or
         accept Second_Button_Released;
         Put_Line ("second released");
      or
         terminate;
      end select;
   end loop;
end Main;

但很明显,如果你必须扩展你的代码以处理更多的按钮,这将不容易维护!

答案 1 :(得分:0)

您需要有一个select语句 - 这将允许调用任务选择任何可能打开的选项(第一个,第二个)。 目前你有两个无限循环,所以如果第二次接受发生,我会感到惊讶。

所以...

task multiple_entry is
    entry increment;
    entry decrement;
end multiple_entry;

task body multiple_entry is
    i : integer;
begin
    select
        accept increment;
        i := i + 1;
    or
        accept decrement do
            i := i - 1;
        end decrement
    or
        terminate;
    end select;
end;

应该如何构建。