【发布时间】:2012-01-12 19:33:54
【问题描述】:
我在四处阅读并了解到,如果我在 .Net 中使用任务而不是线程,它们将不会受到线程存在问题的上下文切换的影响。
不过,我也注意到,Tasks 只是在幕后使用线程。
所以我有点困惑,感谢任何澄清。
【问题讨论】:
-
也许您应该发布您发现的提供错误信息的 URL。
标签: .net multithreading task context-switch
我在四处阅读并了解到,如果我在 .Net 中使用任务而不是线程,它们将不会受到线程存在问题的上下文切换的影响。
不过,我也注意到,Tasks 只是在幕后使用线程。
所以我有点困惑,感谢任何澄清。
【问题讨论】:
标签: .net multithreading task context-switch
你读错了。
Task 是 TPL 的一部分。 TPL 使用比 CLR 的线程池更高级的调度程序。一个例子是 TPL 调度器使用WorkStealingQueues。
几个事实:
Task.Factory.StartNew 还是ThreadPool.QueueUserWorkItem,两者都将使用相同的线程池 (.NET 4.0)Task 还是“原始”线程,每个时间片都会导致上下文切换。 Task 将导致与常规线程一样多的上下文切换。请注意,只有在没有足够的处理器同时处理线程时才会发生上下文切换。
一些要查看的链接:
TPL 和 Threadpool 的区别,以及 .NET 4.0 中的更改线程池: http://www.danielmoth.com/Blog/New-And-Improved-CLR-4-Thread-Pool-Engine.aspx
展示了如何在 C# 中实现 WorkStealingQueue: http://www.bluebytesoftware.com/blog/2008/08/12/BuildingACustomThreadPoolSeriesPart2AWorkStealingQueue.aspx
daniel moth 博客文章的简短版本: http://blogs.msdn.com/b/jennifer/archive/2009/06/26/work-stealing-in-net-4-0.aspx
【讨论】:
上下文切换不是线程固有的,而是线程滥用所固有的。任务以这样一种方式使用线程,即任何正在运行的线程都可以执行任何需要完成的任务,从而避免了线程被滥用时发生的代价高昂的上下文切换。
【讨论】: