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
中反之亦然