首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >.NET中的分散任务调度技术

.NET中的分散任务调度技术
EN

Stack Overflow用户
提问于 2013-08-09 15:11:19
回答 2查看 827关注 0票数 0

我一直试图了解更多关于CLR4.0的细节。以及微软推荐的ThreadPool和不同的策略。我认为自己在很多这些主题上都是最新的,并且每天都使用线程和并发代码。

最近,我再次回顾了并行模式和实践,并对分散调度技术部分有了一点了解,该部分简要介绍了“窃取工作”和本地线程队列与全局线程队列。

我要问的问题是:

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

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

EN

回答 2

Stack Overflow用户

发布于 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的排队行为

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

但是,正如这篇关于PreferFairness的文章所强调的,这些标志的实现细节/效果可能会随着.NET框架的新实现而改变。

票数 1
EN

Stack Overflow用户

发布于 2013-08-09 15:23:39

你也无法控制。这是描述默认线程调度程序如何调度其任务。这就是它的工作原理。您可以完全创建自己的TaskScheduler,并从头编写自己的调度程序,还可以使用TaskCreationOptions向调度程序提供一些提示(如果它愿意,它可以免费忽略),但这些选项都不允许您指定任务进入的队列中的哪个队列。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18149983

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档