C# NET中的分散任务调度技术

C# NET中的分散任务调度技术,c#,.net,clr,clr4.0,work-stealing,C#,.net,Clr,Clr4.0,Work Stealing,我一直在努力学习CLR 4.0的更多细节。以及线程池和微软推荐的不同策略。我认为我自己在这些主题上是最新的,并且每天使用线程和并发代码。p> 最近我再次浏览了一遍,有点了解了分散式调度技术,该部分简要概述了“工作窃取”和本地与全局线程队列 我的问题是: 1) 偷窃工作是选择加入还是选择退出?使用本地线程队列也一样吗?或者,CLR 4.0默认情况下会发生这种情况吗 2) 我们是否可以控制使用的是本地线程队列还是全局线程队列?如果是这样,通过什么API调用?您对这两者都没有控制权。这描述了默认线程调

我一直在努力学习CLR 4.0的更多细节。以及线程池和微软推荐的不同策略。我认为我自己在这些主题上是最新的,并且每天使用线程和并发代码。p> 最近我再次浏览了一遍,有点了解了分散式调度技术,该部分简要概述了“工作窃取”和本地与全局线程队列

我的问题是:

1) 偷窃工作是选择加入还是选择退出?使用本地线程队列也一样吗?或者,CLR 4.0默认情况下会发生这种情况吗


2) 我们是否可以控制使用的是本地线程队列还是全局线程队列?如果是这样,通过什么API调用?

您对这两者都没有控制权。这描述了默认线程调度程序如何调度其任务。这就是它的工作原理。您可以完全创建自己的TaskScheduler,从头开始编写自己的计划程序,还可以使用
TaskCreationOptions
向计划程序提供一些提示(如果它愿意,可以随意忽略),但这些选项都不允许您指定任务进入哪些队列

任务模型的要点是,您不需要担心这些细节;其目的是工作可以由任何工作线程按任何顺序进行调度,并且您允许框架调度器尽最大努力优化工作。添加常量使其更难有效地执行此操作。如前所述,如果需要完全不同的任务调度算法,可以使用自定义任务调度程序

1) 偷窃工作是选择加入还是选择退出?使用本地线程也一样 排队?或者,CLR 4.0默认情况下会发生这种情况吗

工作偷盗是默认情况。在.NET4.0中,线程池扩展为工作窃取行为。默认的TaskScheduler(System.Threading.Tasks.ThreadPoolTaskScheduler)基于ThreadPool类。因此,它是自4.0以来的默认值

2) 我们是否可以控制使用本地线程还是全局线程 排队?如果是,通过什么API调用

正如@Servy已经提到的,为了完全控制,您需要编写自己的TaskScheduler。(如中所述)

但您可以通过以下方式影响排队行为:

  • LongRunning:任务在Treadpool之外获得一个新创建的线程
  • preferfairity:新的子任务(通常会在执行父任务的线程的本地队列中结束)将在全局队列中结束。因此,如果所有任务都标记为“preferfairity”,那么工作窃取和本地排队将被有效地停用

但是,正如强调的那样,这些标志的实现细节/效果可能会随着.NET framework的新实现而改变。

这与CLR没有任何(直接)关系,这都是基于.NET framework代码的。据我所知,TaskScheduler。当任务由非任务线程创建时,默认设置为全局队列或线程池。当任务由任务线程创建时,默认为当前上下文,即本地队列。传入您自己的TaskScheduler选项可以强制任务在本地、全局或非池中运行。