正确关闭工作窃取线程池

时间:2016-08-17 05:30:40

标签: c multithreading atomic

鉴于工作窃取线程池系统,其中每个工作项可以在线程本地工作队列中生成新任务 - 如果已满,则可以溢出到全局队列。

您如何安全有效地协调此类系统的关闭?假设您只有基本的原子操作和关键部分锁。

澄清一些并简化。假设每个线程仅从其本地工作队列中获取任务(其他线程之间没有窃取队列以简化)。如果它的本地工作队列耗尽,它将锁定全局工作队列并窃取工作以添加到其本地工作队列。本地工作队列不需要锁,因为它们特定于每个工作线程。

使用简单的标记或原子序数' active'由于其他工作人员可能将新工作泄漏到全局队列的情况下,工作线程无法工作,而另一个工作者线程视图可能认为它是唯一留下工作的工作人员。

所有工人只有在没有工作时才会退出。

1 个答案:

答案 0 :(得分:0)

最大的要求是通过某种方式保存每个任务的定义,以便将待处理任务的状态保存到持久存储中。然后实现一个“停止”标志(上面有一个互斥锁)。从池中获取任务执行的方法检查该标志,如果设置,则返回“终止工作线程”指示(不同于“无任务可用”结果,使线程等待并再次尝试)。线程在获得该指示时终止,并且整个池管理线程等待直到所有工作线程终止,然后终止池。主程序必须等到池终止并且池管理线程退出,一旦发生这种情况,终止程序是安全的。如果程序需要继续运行并稍后重新启动池,那么这也是在它可以执行任何会影响池配置或重新启动池之前必须满足的条件。