2015-07-28 42 views
0

我已經創建了定義的2個任務類型,並在主程序中對它們進行了實例化。Ada 95任務:我如何從一個實例化任務發送集合到另一個實例化任務中的另一個集合?

如何在單獨的任務之間發送集合點?

Procedure Task_Prog is 
    task type Task_one is 
     entry Redezvous_One; 
    end Task_one; 

    task type Task_Two is 
     entry Redezvous_Two; 
    end Task_Two; 

    task body Task_one is 
     Finished : Boolean := False; 
    begin 
     while not Finished loop 
      accept Redezvous_One do 
       finished := True; 
       Task_Instantiation_B.Redezvous_Two; 
      end Redezvous_One; 
     end loop; 
    end Task_one; 

    task body Task_Two is 
     Finished : Boolean := False; 
    begin 
     while not Finished loop 
      accept Redezvous_Two do 
       finished := True; 
      end Redezvous_Two; 
     end loop; 
    end Task_Two; 

    Task_Instantiation_A : Task_one; 
    Task_Instantiation_B: Task_Two; 
begin 
    Task_Instantiation_A.Redezvous_One; 
end Task_Prog; 

編譯錯誤是:

task_prog.ada: Error: line 17 col 4 LRM:4.1(3), Direct name, Task_Instantiation_B, is not visible, Ignoring future references

我正在尋找一個任務能夠管的命令/會合到已經被實例化的其他任務。

任何幫助將不勝感激。

回答

6

簡單地將任務實例化移動到任務主體聲明上方將使任務實體可以看到任務主體,並且通過此更改,您的示例可以成功編譯。

也就是說......

Procedure Task_Prog is 
    task type Task_one is 
     entry Rendezvous_One; 
    end Task_one; 

    task type Task_Two is 
     entry Rendezvous_Two; 
    end Task_Two; 

    Task_Instantiation_A : Task_one; 
    Task_Instantiation_B : Task_Two; 

    task body Task_one is 
    ... etc 

這可能不是你的問題比較大兼容。如果不是,則在問題中添加更多細節或限制。

0

首先,你需要認識到,一切都在Accept/do ... end是會合,因此調用Task_Instantiation_B.Redezvous_TwoRedezvous_One可能死鎖。 (鑑於這是一個任務類型,你可以有一個比調用Redezvous_One,這將解決這個問題不同的任務)

因此,改變這種:

while not Finished loop 
     accept Redezvous_One do 
      finished := True; 
      Task_Instantiation_B.Redezvous_Two; 
     end Redezvous_One; 
    end loop; 

這樣:

while not Finished loop 
     accept Redezvous_One do 
      finished := True; 
     end Redezvous_One; 
    end loop; 
    Task_Instantiation_B.Redezvous_Two; 

其次,你需要重新安排你的任務,規範和機構:

Task type Task_one is --... 
Task type Task_two is --... 

Task body Task_one is --... 
Task body Task_two is --... 

笑這樣做。 - 現在,如果你不會有多個人將task type更改爲task,那麼你應該很好。

相關問題