线程是在多个处理器上执行的?

Cri*_*nSO 17 c# multithreading

似乎Task类为我们提供了使用系统的多个处理器的能力.Thread类也可以在多个处理器上运行,还是仅在单个处理器上使用时间分片?(假设一个系统有多个核心).

我的问题是,如果线程将/可以在多个核心上执行,那么Task和Parallelism有什么特别之处?

dog*_*ose 17

当你创建thread它时形成一种逻辑工作组..NET Framework将从系统中获取CPU时间.很可能多个线程将在不同的核心上运行(这是系统所困扰的东西 - 甚至.NET对此没有任何影响)

但是系统可能会在同一个内核上执行所有线程,甚至可能在执行期间在多个内核之间移动执行.请记住,您是托管托管的线程,而不是真正的系统线程.

(正确地说我应该说:系统可以在同一个系统线程中执行您的托管线程,或者为多个托管线程使用多个系统线程.)

也许你想看一下这篇博客文章:http://www.drdobbs.com/parallel/managed-threads-are-different-from-windo/228800359这里的解释在细节方面非常好.

  • 感谢您的答案,如果线程将/可以在多个核心上执行,那么Task Parallelism有什么特别之处? (2认同)

use*_*965 12

第一个问题不错.+1

我建议你阅读Joseph Albahari在C#中的线程.如果你仔细阅读帖子,你会发现:

线程如何工作

多线程由线程调度程序内部管理,线程调度程序是CLR通常委托给操作系统的函数.线程调度程序确保为所有活动线程分配适当的执行时间,并且等待或阻塞的线程(例如,在独占锁或用户输入上)不消耗CPU时间.

因此,多线程由操作系统通过线程调度程序处理.

此帖还有:

多处理器计算机上,多线程是通过时间切片和真正并发混合实现的,其中不同的线程在不同的CPU上同时运行代码.几乎可以肯定,仍然会有一些时间切片,因为操作系统需要服务自己的线程 - 以及其他应用程序的线程.

  • 您的"不错的第一个问题.+ 1"评论可能应该转移到对该问题的评论中,因为它对于发现此问题的其他用户不具有相关性或帮助. (2认同)

dca*_*tro 11

- 似乎Task类为我们提供了在系统中的多个处理器上使用的能力.

-if线程将/可以在多个内核上执行那么Task Parallelism有什么特别之处?

Task类只是TPL小,但很重要的部分,(任务并行库).TPL是一种高级抽象,因此您不必直接使用线程.它封装并隐藏了您必须为任何体面的多线程应用程序实现的大部分流失.

任务不介绍,你不能对自己实施任何新的功能,本身(这是你的问题的核心,我相信).它们可以是同步的或异步的 - 当它们是异步时,它们要么使用Thread内部类,要么使用IOCP端口.

TPL解决的一些问题包括:

  • 从调用线程上的子线程重新抛出异常.
  • 异步代码(启动线程 - >在等待子线程时运行任意代码 - >子线程结束时恢复)看起来好像是同步的,大大提高了可读性和可维护性
  • 更简单的线程取消(使用CancellationTokenSource)
  • 使用PLINQParallel类进行并行查询/数据操作
  • 使用TPL Dataflow的异步工作流程