Ada 循环并发

Ada 循环并发,ada,Ada,又是我。 所以我在Ada中遇到了并发问题。我的程序基本上是这样的: for i in 1..it loop for x in 1..A loop for y in 1..B --tab(x,y):=... end loop; end loop; for x in 1..A loop for y in 1..B --tab(x,y):=... end loop

又是我。 所以我在Ada中遇到了并发问题。我的程序基本上是这样的:

for i in 1..it loop

    for x in 1..A loop
        for y in 1..B
            --tab(x,y):=...
        end loop;
    end loop;

    for x in 1..A loop
        for y in 1..B
            --tab(x,y):=...
        end loop;
    end loop;

end loop;

在这个循环中有一些计算。我打算做的是使这两个“内部”循环同时工作。循环1中的一个元素,然后是循环2中的一个元素,或者稍微“对称”。但通常我希望它看起来是这样的:第一次迭代,两个“内部”循环同时工作,所有操作完成,迭代完成。第二次迭代同样如此。。我的问题是:我能用ENTRY和ACCEPT语句吗?还是这需要更多的东西?如果你能给我指出正确的解决方案,因为我看到了很多例子,但没有一个适合我的问题

如果两个内部循环确实不共享任何数据,您可以这样做:

task First;
task Second;

task body First is
   ...
begin
   for i in 1 .. it loop
      for x in 1 .. A loop
         for y in 1 .. B loop
             ...
         end loop;
      end loop;
   end loop;
end First;

task body Second is
   ...
begin
   for i in 1 .. it loop
      for x in 1 .. A loop
         for y in 1 .. B loop
             ...
         end loop;
      end loop;
   end loop;
end Second;

您可能希望将任务数量限制为系统支持的内核数量。请参见计算pi的示例:

在提出更多问题之前,您应该回到以前的问题并接受有用的答案。您是对的,只是解决了它。我们可能需要更多的信息来帮助设计并行实现。例如,如果
tab(x,y)
是共享的,并且由两个进程进行更新,那么最好将其实现为“受保护对象”,并且您不需要entry/accept语句来同步对它的访问。这些(也称为会合)可能是从一个任务传递到另一个任务的消息的最佳保留。如果你的循环没有这样交互,你可以使用更轻的任务而不需要集合。tab(x,y)是共享对象,但是每个进程“只能访问”数组的一半(他的部分),所以看起来它们实际上没有共享任何结构。对不起,我错了。它们确实以最小的方式共享这个数组,但它们确实共享(半+一列)。因此,“主”迭代必须在两个进程完成时结束。一个(惰性)选项是在那里进行会合以进行同步。(正确的做法是在适当的时间复制共享数据。)感谢您的帮助。虽然通常最好使用尽可能多的自然任务来建模手头的问题,但这会使代码更高级别,更便于移植。但在这种情况下,自然形式似乎是一个单一任务。