1) 偷工作是选择加入还是选择退出?使用本地线程队列也一样吗?或者 CLR 4.0 默认情况下会发生这种情况吗?
工作窃取是默认设置。在 .NET 4.0 中,ThreadPool 被扩展为工作窃取行为。而默认的TaskScheduler(System.Threading.Tasks.ThreadPoolTaskScheduler)是基于ThreadPool Class的。所以它是默认的,从 4.0 开始。
2)我们是否可以控制我们是使用本地线程队列还是全局线程队列?如果是这样,通过什么 API 调用?
正如@Servy 已经提到的,要获得完全控制,您需要编写自己的 TaskScheduler。(如如何:创建限制并发的任务计划程序中所述)
但是您可以通过TaskCreationOptions以某种方式影响排队行为:
- LongRunning:任务在 Treadpool 之外获得一个新创建的线程
- PreferFairness:新的子任务(通常会在执行父任务的线程的本地队列中结束)将在全局队列中结束。因此,如果所有任务都标有“PreferFairness”,那么工作窃取和本地排队将被有效地停用。
但是,正如这篇关于 PreferFairness的文章所强调的那样,这些标志的实现细节/效果可能会随着 .NET 框架的新实现而改变。