2014-01-05 42 views
0

它是我的一次。 所以我在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語句來做到嗎?或者這是否會需要更多?如果你能指出我正確的解決方案,因爲我看過很多例子,但沒有一個適合我的問題。

+1

在問任何問題之前,你應該回到你以前的問題,**接受**有用的答案。 –

+0

你說得對,只是修好了。 – user2443194

+1

我們可能需要更多信息來幫助設計並行實現。例如,如果'tab(x,y)'是共享的,並且由兩個進程更新,它可能會最好實現爲「受保護對象」,並且不需要輸入/接受語句來同步對它的訪問。這些(又名Rendezvous)可能最適合用於從一個任務傳遞到另一個任務的消息。如果你的循環不像那樣進行交互,那麼你可以使用輕量級的任務而不需要集合。 –

回答

0

如果兩個內環真的不共享任何數據,你能做到這魔神:

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; 
+0

對不起,我錯了。他們確實以最小的方式共享這個數組,但他們確實(半+一列)。所以當兩個過程完成時,「主」迭代必須結束。 – user2443194

+1

然後一個(懶惰)選項放在那裏集合進行同步。 (「正確」是在適當的時間複製共享數據。) –

+0

感謝您的幫助。 – user2443194

0

您可能要任務的數量限制爲系統支持的內核數量。看到這個例子計算pi: https://github.com/AdaDoom3/OldStuff/blob/master/time_pi.adb

+0

儘管通常使用盡可能多的任務來模擬手頭的問題通常是最好的,但這會使您的代碼更高級和更便於攜帶。 – Shark8

+0

但在這種情況下,它看起來像自然形式是一項任務。 –