我一直在尝试了解有关CLR 4.0的更多详细信息。以及ThreadPool和Microsoft推荐的不同策略。我认为自己在很多这些主题上都是最新的,并且每天都使用线程和并发代码。
我最近再次回到Parallel Patterns and Practices,我对分散式调度技术部分有所了解,该部分简要概述了“工作窃取”以及本地与全局线程队列。
我的问题是:
1)是否正在窃取选择加入或退出?使用本地线程队列相同吗?或者这是否在CLR 4.0默认情况下发生?
2)我们是否可以控制是否使用本地或全局线程队列?如果是这样,通过什么API调用?
答案 0 :(得分:1)
1)工作是否会选择加入或选择退出?使用本地线程也是如此 队列?或者这是否在CLR 4.0默认情况下发生?
工作窃取是默认的。在.NET 4.0中,ThreadPool扩展了工作窃取行为。默认的TaskScheduler(System.Threading.Tasks.ThreadPoolTaskScheduler)基于ThreadPool类。所以它是默认的,因为4.0。
2)我们是否可以控制使用本地线程还是全局线程 队列?如果是这样,通过什么API调用?
正如@Servy已经提到的,为了完全控制,你需要编写自己的TaskScheduler。 (如How to: Create a Task Scheduler That Limits Concurrency)
中所述但是你可以用TaskCreationOptions:
以某种方式影响排队行为但是,正如this article about PreferFairness强调的那样,这些标志的实现细节/效果可能会随着.NET框架的新实现而改变。
答案 1 :(得分:0)
你无法控制。这是描述默认线程调度程序如何安排它的任务。这就是它的工作原理。您可以完全创建自己的TaskScheduler,并从头开始编写自己的调度程序,也可以使用TaskCreationOptions
向调度程序提供一些提示(如果需要,可以自由忽略),但这些选项都没有允许您指定任务进入哪些队列。
任务模型的主要点是您无需担心此类细节;意图是任何工作线程可以按任何顺序调度工作,并且您允许框架调度程序最好地优化工作。添加常量使得它更难以有效地执行此操作。如前所述,如果您需要一种完全不同的算法来安排任务,则可以使用自定义任务调度程序。