簡體   English   中英

父線程什么時候同步一個非全局scope的ada任務類型變量?

[英]When does the parent thread synchronize with an ada task type variable with a non-global scope?

我正在處理一些多線程 Ada.network 代碼,其中涉及並行接受和處理多個連接。 使用 Ada 任務的理想情況,不是嗎? 具體來說,多個任務類型變量,在一個循環中開始。

好吧,我做了這樣的事情:

with Ada.Text_IO;
use Ada.Text_IO;

Procedure foo is
   task type handler is
      entry Start(I: Integer);
   end handler;
   
   task body handler is
      task_index: Integer;
   begin
      accept Start(I: Integer) do
         task_index:=I;
      end Start;
      for I in 1..5 loop
         Put_Line("Task "&task_index'Image&": "&I'Image);
      end loop;
   end handler;

begin -- foo

   for t in 1..5 loop
      declare
         bar: handler;
      begin
         bar.Start(t);
      end;
   end loop;
end foo;

期望任務一旦接受start條目,就會並行執行。 但是,如本例所示,主任務依次等待每個任務執行完畢:

$ gnat make foo
$ ./foo
Task  1:  1
Task  1:  2
Task  1:  3
Task  1:  4
Task  1:  5
Task  2:  1
Task  2:  2
Task  2:  3
Task  2:  4
Task  2:  5
Task  3:  1
Task  3:  2
Task  3:  3
Task  3:  4
Task  3:  5
Task  4:  1
Task  4:  2
Task  4:  3
Task  4:  4
Task  4:  5
Task  5:  1
Task  5:  2
Task  5:  3
Task  5:  4
Task  5:  5

預先聲明所有任務,在一個數組中解決了這個問題,但讓我很好奇這實際上是如何工作的,為什么,以及在哪里記錄。

ARM2012 第 9.2 節第 6/3 段在我看來是說主線程在執行結束時等待它的子任務完成,但實際上它似乎在任務離開當前 scope 繼續執行之前等待(即循環周圍,並開始下一個任務)。

這是編譯器問題、文檔問題還是編碼問題?

該程序(兩個版本)都按照 Ada 標准所說的那樣工作。 在您顯示的版本中,任務 object bar 在 declare..begin..end 塊中本地聲明,取決於該塊(它是任務的“主”),因此該塊語句等待任務在執行繼續之前終止(離開塊語句)。

定義它的 RM 部分是第 9.3 節,“任務依賴性 - 任務終止”, http://www.ada-auth.org/standards/rm12_w_tc1/html/RM-9-3.html ,它顯示了一個示例接近你的代碼。 我不認為第 9.2 節中的第 6/3 段是相關的——它描述了一些相當特殊的情況,在這些情況下,本地創建的任務永遠不會被激活。

正如您所發現的,解決方案是全局聲明任務對象,以便“主人”壽命更長。 9.3 節中的示例顯示了另一種使用訪問類型和動態分配的任務對象的解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM