任务线程上下文切换

5
我在阅读相关资料时发现,如果我在 .Net 中使用 Tasks 而不是 Threads,则 Tasks 不会像 Threads 一样容易受到上下文切换的影响。
但是,在阅读相关资料时,我也注意到,Tasks 在底层其实也是使用 Threads 的。
因此,我有些困惑,请大家帮忙澄清。

1
也许你应该发布你找到的那个给你错误信息的URL。 - John Saunders
2个回答

11
你所读的是错误的。 Task 是 TPL 的一部分。TPL 使用比 CLR 线程池更先进的调度程序,例如 TPL 调度程序使用 WorkStealingQueues
一些事实:
- 不管你使用 Task.Factory.StartNew 还是 ThreadPool.QueueUserWorkItem,两者都将使用相同的线程池(.NET 4.0)。 - 无论你使用 Task 还是“原始”线程,每个时间片都会导致上下文切换。 - 如果更高优先级的线程变为可运行状态,也会导致上下文切换。 - 一个 Task 将导致与常规线程一样多的上下文切换。
请注意,只有在没有足够的处理器同时处理线程时,才会发生上下文切换。
一些要查看的链接:

1

上下文切换并不是线程本身固有的问题,而是线程被误用时产生的问题。任务以这样一种方式使用线程,即无论哪个线程正在运行,都可以执行需要完成的任何任务,从而避免了线程被误用时发生的昂贵上下文切换。


3
线程是唯一可以进行上下文切换的事物。进程内的线程可以进行上下文切换,但进程本身不行。而进程何时出现在讨论中呢?这个问题是关于线程和任务的。 - John Saunders
1
我不知道你是否故意误解我的意思,但问题的背景是多线程以及它是否导致额外的上下文切换。我认为你故意孤立我的第一句话,并忽略了它是对问题的回答,并在紧接着的句子中进一步澄清了这一点。 - David Schwartz
1
我在阅读相关资料时发现,如果我在 .Net 中使用 Tasks 而不是 Threads,它们就不会像 Threads 一样容易受到上下文切换的影响。你是否认为他所说的 "Tasks" 意味着 "processes"?他正在询问 .NET 中的两种不同的多线程技术,而不是关于多线程与否的问题。 - John Saunders
1
好的,我现在明白了。你迫切需要澄清。你的意思是在任务之间切换时,没有上下文切换。你并不是说操作系统从不抢占线程。当然,抢占在线程中是固有的,但可以通过使用任务来封装工作而避免在从一项工作切换到另一项工作时进行上下文切换,而不是使用原始线程。 - John Saunders
2
恕我直言,有没有任何人关心的操作系统不使用抢占?你的说法有点学术化。 - John Saunders
显示剩余14条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接