是在多个处理器上执行的线程
本文关键字:执行 线程 处理器 | 更新日期: 2023-09-27 18:25:25
Task类似乎为我们提供了使用系统多个处理器的能力。Thread类是在多个处理器上也工作,还是只在单个处理器上使用时间切片?(假设系统具有多个核心)。
我的问题是,如果线程将/可以在多个核心上执行,那么任务和并行性有什么特别之处?
创建thread
时,它形成了一种逻辑工作组。.NET Framework将从系统中获取CPU时间。很可能多个线程将在不同的内核上运行(这是系统处理的事情,甚至.NET对此都没有任何影响)
但是,系统可能会在同一个内核上执行所有线程,甚至在执行期间在多个内核之间移动执行。请记住,您正在创建托管的线程,而不是真实的系统线程。
(正确地说,我应该说:系统可以在同一系统线程内执行托管线程,也可以对多个托管线程使用多个体系线程 也许你想看看这篇博客文章:http://www.drdobbs.com/parallel/managed-threads-are-different-from-windo/228800359细节方面解释的还可以。
第一个问题不错+1
我建议你阅读Joseph Albahari的《C#线程》。如果你通读这篇文章,你会发现:
线程工作原理
多线程由线程调度程序内部管理CLR通常委托给操作系统的函数A线程调度程序确保所有活动线程都得到适当的分配执行时间,以及等待或阻塞的线程(例如,在独占锁或用户输入上)不消耗CPU时间
所以多线程是由操作系统通过线程调度程序来处理的。
此外,该帖子有:
在多处理器计算机上,多线程由时间切片和真正并发的混合,其中不同线程在不同的CPU上同时运行代码。几乎可以肯定由于操作系统需要为自己的线程以及其他线程提供服务应用程序。
-看来Task类为我们提供了在系统中的多个处理器上使用的能力。
-如果线程将/可以在多个核心上执行,那么任务并行性有什么特别之处?
Task
类只是TPL(任务并行库)的一个小但重要的部分。TPL是一个高级抽象,所以您不必直接使用线程。它封装并隐藏了任何像样的多线程应用程序都必须实现的大部分变动。
任务不会引入任何你自己无法实现的新功能,本身(我相信这是你问题的核心)。它们可以是同步的,也可以是异步的——当它们是异步的时,它们要么在内部使用Thread
类,要么使用IOCP端口。
TPL解决的一些问题是:
- 从调用线程上的子线程重试异常
- 异步代码(启动线程-在等待子线程时运行任意代码-在子线程结束时恢复)看起来像是同步的,大大提高了可读性和可维护性
- 更简单的线程取消(使用
CancellationTokenSource
) - 使用PLINQ或
Parallel
类的并行查询/数据操作 - 使用TPL数据流的异步工作流