我在阅读相关资料时发现,如果我在 .Net 中使用 Tasks 而不是 Threads,则 Tasks 不会像 Threads 一样容易受到上下文切换的影响。
但是,在阅读相关资料时,我也注意到,Tasks 在底层其实也是使用 Threads 的。
因此,我有些困惑,请大家帮忙澄清。
但是,在阅读相关资料时,我也注意到,Tasks 在底层其实也是使用 Threads 的。
因此,我有些困惑,请大家帮忙澄清。
Task
是 TPL 的一部分。TPL 使用比 CLR 线程池更先进的调度程序,例如 TPL 调度程序使用 WorkStealingQueues
。Task.Factory.StartNew
还是 ThreadPool.QueueUserWorkItem
,两者都将使用相同的线程池(.NET 4.0)。
- 无论你使用 Task
还是“原始”线程,每个时间片都会导致上下文切换。
- 如果更高优先级的线程变为可运行状态,也会导致上下文切换。
- 一个 Task
将导致与常规线程一样多的上下文切换。TPL和线程池的区别,以及.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
上下文切换并不是线程本身固有的问题,而是线程被误用时产生的问题。任务以这样一种方式使用线程,即无论哪个线程正在运行,都可以执行需要完成的任何任务,从而避免了线程被误用时发生的昂贵上下文切换。