我一直试图了解更多关于CLR4.0的细节。以及微软推荐的ThreadPool和不同的策略。我认为自己在很多这些主题上都是最新的,并且每天都使用线程和并发代码。
最近,我再次回顾了并行模式和实践,并对分散调度技术部分有了一点了解,该部分简要介绍了“窃取工作”和本地线程队列与全局线程队列。
我要问的问题是:
1)偷窃工作是选择加入还是选择退出?使用本地线程队列也一样吗?或者在CLR4.0中默认情况下会发生这种情况吗?
2)我们是否可以控制我们是使用本地线程队列还是全局线程队列?如果是,通过什么API调用?
发布于 2013-08-09 15:45:46
1)偷窃工作是选择加入还是选择退出?使用本地线程队列也一样吗?或者在CLR4.0中默认情况下会发生这种情况吗?
偷窃工作是默认的。在.NET 4.0中,ThreadPool被扩展为盗窃工作的行为.默认的(System.Threading.Tasks.ThreadPoolTaskScheduler)是基于ThreadPool类的。因此,这是默认的,从4.0开始。
2)我们是否可以控制我们是使用本地线程队列还是全局线程队列?如果是,通过什么API调用?
正如@Servy已经提到的,要实现完全控制,您需要编写自己的TaskScheduler。(如如何:创建限制并发性的任务调度程序所述)
但是您可以在某种程度上影响TaskCreationOptions的排队行为
但是,正如这篇关于PreferFairness的文章所强调的,这些标志的实现细节/效果可能会随着.NET框架的新实现而改变。
发布于 2013-08-09 15:23:39
你也无法控制。这是描述默认线程调度程序如何调度其任务。这就是它的工作原理。您可以完全创建自己的TaskScheduler,并从头编写自己的调度程序,还可以使用TaskCreationOptions向调度程序提供一些提示(如果它愿意,它可以免费忽略),但这些选项都不允许您指定任务进入的队列中的哪个队列。
Task模型的主要要点是您不需要担心这些细节;目的是工作可以由任何工作线程按任何顺序进行调度,并且允许框架调度器进行优化工作。添加常量会使它更难有效地做到这一点。如前所述,如果需要完全不同的调度任务算法,则可以使用自定义任务调度程序。
https://stackoverflow.com/questions/18149983
复制相似问题