Task Ada交会互同步

Task Ada交会互同步,task,sync,ada,Task,Sync,Ada,我有这样的代码: task body Task1Type is begin Put_Line("Task1 Part1"); Task2.Part1Ready; accept Part1Ready; Put_Line("Task1 Part2"); end; task body Task2Type is begin Put_Line("Task2 Part1"); Task1.Part1Ready; accept Part1Ready;

我有这样的代码:

task body Task1Type is
begin
    Put_Line("Task1 Part1");
    Task2.Part1Ready;
    accept Part1Ready;
    Put_Line("Task1 Part2");
end;

task body Task2Type is
begin
    Put_Line("Task2 Part1");
    Task1.Part1Ready;
    accept Part1Ready;
    Put_Line("Task2 Part2");
end;
protected Readiness is
   procedure Task_1_Ready;
   entry Wait_Until_Task_1_Ready;

   procedure Task_2_Ready;
   entry Wait_Until_Task_2_Ready;
private
   Task_1_Is_Ready : Boolean := False;
   Task_2_Is_Ready : Boolean := False;
end Readiness;

protected body Readiness is
   procedure Task_1_Ready is
   begin
      Task_1_Is_Ready := True;
   end Task_1_Ready;

   entry Wait_Until_Task_1_Ready when Task_1_Is_Ready is
   begin
      null;
   end Wait_Until_Task_1_Ready;

   procedure Task_2_Ready is
   begin
      Task_2_Is_Ready := True;
   end Task_2_Ready;

   entry Wait_Until_Task_2_Ready when Task_2_Is_Ready is
   begin
      null;
   end Wait_Until_Task_2_Ready;
end Readiness;

我的逻辑告诉我,每个任务中的part2必须在两个任务都完成task1之后运行。但事实并非如此。我错在哪里?

Task1
调用
Task2.Part1Ready
时,它会阻塞,直到
Task2
发出
接受Part1Ready
。同样,当
Task2
调用
Task1.Part1Ready
时,它会阻塞,直到
Task1
发出
接受Part1Ready

这被称为“致命拥抱”,意味着两项任务都无法继续。解决此问题的一种方法是使用受保护对象,可能如下所示:

task body Task1Type is
begin
    Put_Line("Task1 Part1");
    Task2.Part1Ready;
    accept Part1Ready;
    Put_Line("Task1 Part2");
end;

task body Task2Type is
begin
    Put_Line("Task2 Part1");
    Task1.Part1Ready;
    accept Part1Ready;
    Put_Line("Task2 Part2");
end;
protected Readiness is
   procedure Task_1_Ready;
   entry Wait_Until_Task_1_Ready;

   procedure Task_2_Ready;
   entry Wait_Until_Task_2_Ready;
private
   Task_1_Is_Ready : Boolean := False;
   Task_2_Is_Ready : Boolean := False;
end Readiness;

protected body Readiness is
   procedure Task_1_Ready is
   begin
      Task_1_Is_Ready := True;
   end Task_1_Ready;

   entry Wait_Until_Task_1_Ready when Task_1_Is_Ready is
   begin
      null;
   end Wait_Until_Task_1_Ready;

   procedure Task_2_Ready is
   begin
      Task_2_Is_Ready := True;
   end Task_2_Ready;

   entry Wait_Until_Task_2_Ready when Task_2_Is_Ready is
   begin
      null;
   end Wait_Until_Task_2_Ready;
end Readiness;
然后去掉
Part1Ready
任务条目,替换

task body Task1Type is begin
   Put_Line("Task1 Part1");
   Task2.Part1Ready;
   accept Part1Ready;
   Put_Line("Task1 Part2”);
end;

Task2Type
中反之亦然