关于单个master task控制的worker task的实现问题

Mar*_*o90 1 multithreading ada

我想实现一个控制工作任务的几个实例的主任务。每个工作任务都有三个不同的阶段:

  1. 初始化
  2. 做工作
  3. 报告结果

在开始时,主任务应该初始化所有工作任务(同时)。每个工作任务都有s几秒钟的时间来成功完成其初始化,但s不能保证以秒为单位的完成。

我有什么有效的可能性(信号机制)让主任务监视所有工作任务的初始化状态?我想让每个工作任务访问一个工作任务特定的受保护类型对象,并通过一个过程来设置一个布尔标志,该标志将由单个工作任务在成功完成初始化后设置。

主任务触发所有工作任务的初始化后,它可以记住当前时间并进入循环,通过使用在受保护对象类型中声明的函数来检索初始化状态来定期轮询工作任务初始化状态。如果所有工作任务都已初始化或已过几s秒钟,则退出循环。

我是否必须使用适当的时间值在监视器循环内使用延迟语句来使用这样的轮询概念?我阅读了有关入口调用超时的信息。我可以使用这样的超时来阻止轮询吗?

工作任务成功完成初始化后,它应该等待来自控制任务的信号以执行一个工作包。所以我认为工作任务应该有一个Do_Work条目,因此主任务应该为循环中的所有工作任务调用这些条目,对吗?

主任务可以使用适当的机制来检查是否所有工作任务都已完成其工作包。发生这种情况后,工作任务应该以确定性的方式(不是同时)报告他们的工作结果。因此,如果我Report_Result在工作任务中使用一个条目来等待来自主任务的信号,则在控制任务的循环中调用此条目将导致报告结果的不确定顺序。是否也可以以阻塞方式调用这些条目(如正常过程调用)?

Jim*_*ers 5

您是正确的,主任务可以为每个工作任务调用 Do_Work 条目。同样,主任务可以调用所有工作任务的 Report_Result 条目。

完成此操作的一种简单方法是为工作任务创建任务类型,然后创建工作任务数组。

    procedure Master is
       task type Workers is
          entry Do_Work;
          entry Report_Result;
       end Workers;

       Team : array(1..5) of Workers;

    begin
       -- Initialization will occur automatically
       -- Signal workers to Do_Work

       for Worker of Team loop
          Worker.Do_Work;
       end loop;

       -- Create a loop to signal all reports
       -- While the workers may finish in a random order, the 
       -- reporting will occur in the order of the array indices

       for Worker of Team loop
          Worker.Report_Result;
       end loop;
    end Master;
Run Code Online (Sandbox Code Playgroud)

此示例不完整,因为它没有为 Workers 任务类型定义任务主体。该计划的重要特点是:

  • 当执行到达 Master 中的 begin 语句时,Team 数组中的 worker 的任务初始化开始。
  • Master 将等待 Team 的每个元素接受对 Do_Work 的入口调用。
  • Team 的每个元素都会在accept 语句处等待Master 调用Do_Work 条目。
  • master 将等待 Team 的每个元素接受 Report_Result 条目。
  • Team 的每个元素都将在接受 Report_Result 时等待主节点调用该条目。

Ada Rendezvous 机制巧妙地协调了 master 和每个 worker 之间的所有通信。

  • 如果任务以`accept Report_Result do` 结束,报告结果`end accept;`,那么调用者将确实阻塞,直到结果被发送。 (2认同)