【发布时间】:2016-12-23 15:29:27
【问题描述】:
给定一个工作窃取线程池系统,其中每个工作项都可以在线程本地工作队列中生成新任务 - 如果已满,可以溢出到全局队列。
您将如何安全有效地协调此类系统的关闭?假设您只有基本的原子操作和临界区锁可用。
进一步澄清和简化。假设每个线程仅从其本地工作队列中获取任务(为了简化,没有在其他线程队列之间窃取)。如果它的本地工作队列用尽,它将锁定全局工作队列并窃取工作以添加到其本地工作队列中。本地工作队列不需要锁,因为它们特定于每个工作线程。
使用简单的标志或“活动”工作线程的原子计数将不起作用,因为其他工作人员可能会将新工作溢出到全局队列中,而从另一个工作线程看来,它可能认为它是唯一剩下的工作人员工作。
所有工作人员只有在没有工作时才应该退出。
【问题讨论】:
-
我投票结束这个问题,因为它太宽泛了。我相信您应该关注您的问题并告诉我们您到目前为止所做的尝试。就个人而言,我可能会举起“停止”标志并加入所有线程。这并不保证关闭,因为现有任务可能会永远运行(他们可能会自称)......所以我也会公开标志并在自我更新任务中检查它......我在线程池中做了类似的事情我为服务器写的。
-
对不起,我认为它非常具体。由于无法保证线程之间何时发生可见性,因此提高停止标志不起作用,也无法对当前活动的工作人员进行简单的原子计数。通过提交自己导致无限循环的任务将是任务设计中的错误,而不是池本身。
-
有一个具体的问题并不意味着它不是太宽泛。 “太宽泛”是指可能的答案,在您询问“如何...”时,您可能会获得很多关于什么有效的意见。没有“正确”的答案。
-
我已经编辑了一些更多的说明和简化,如果有帮助的话?
-
您可能想在Programmer's StackExchange 上尝试这个问题,这通常会迎合更广泛的基于意见的代码设计问题。
标签: c multithreading atomic