【发布时间】:2019-10-23 05:11:32
【问题描述】:
我想实现一个主任务来控制一个工作任务的多个实例。每个工作任务都有三个不同的阶段:
- 初始化
- 工作
- 报告结果
一开始,主任务应该初始化所有工作任务(同时)。然后每个工作任务有s 秒才能成功完成其初始化,但不能保证在s 秒内完成。
我必须让主任务监控所有工作任务的初始化状态有哪些有效的可能性(信号机制)?我想让每个工作任务访问一个工作任务特定的受保护类型对象,并设置一个布尔标志,该标志将由各个工作任务成功完成初始化后设置。
在主任务触发所有工作任务的初始化后,它可以记住当前时间并进入循环以使用在受保护对象类型中声明的函数来定期轮询工作任务初始化状态以检索初始化状态。如果所有工作任务都已初始化或经过s 秒,则循环退出。
我是否必须使用适当的时间值在监视器循环内使用延迟语句来使用这种轮询概念?我阅读了有关入口调用超时的信息。我可以使用这样的超时来阻止轮询吗?
在工作任务成功完成初始化后,它应该等待来自控制任务的信号以执行一个工作包。所以我认为一个工作任务应该有一个Do_Work 条目,因此主任务应该在一个循环中为所有工作任务调用这些条目,对吗?
主任务可以使用适当的机制来检查所有工作任务是否已完成其工作包。发生这种情况后,工作任务应该以确定性的方式(不是同时)报告他们的工作结果。因此,如果我在工作任务中使用Report_Result 条目来等待来自主任务的信号,则在控制任务的循环中调用此条目将导致报告结果的不确定顺序。是否也可以以阻塞方式调用这些条目(如普通过程调用)?
【问题讨论】:
-
也许我误解了这个问题,但你能详细说明一下初始化时间限制吗?时间预算
s[s] 是硬性要求还是仅仅是备注?假设您有 10 个任务。其中 8 个能够在s[s] 内初始化,其中 2 个不能。那么预期和/或可接受的行为是什么?只是继续将工作委派给及时初始化的 8 个任务,并丢弃没有初始化的 2 个?必须取消这两个任务的初始化吗?还是等待所有worker都初始化好? -
抱歉,我的问题描述不够完整/清晰。如果工作人员未能在给定时间内初始化,则应将其丢弃。
-
我不明白你为什么想要一个主任务来控制工作任务。与许多语言不同,Ada 任务是自调度的,通常不需要控制。任务池的典型实现是在 PragmARC.Job_Pools (github.com/jrcarter/PragmARC/blob/Ada-07/pragmarc-job_pools.ads) 中,没有主人控制它们。
-
我有兴趣在所有工作任务完成当前处理周期中分配的工作后获取每个工作任务的结果。结果应该以确定的顺序发送到另一个系统。发送完所有结果后,将启动一个新的处理周期。如果不使用某种控制实例,我不知道如何实现这一点。
标签: multithreading ada