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

时间:2014-10-03 15:06:48

标签: c# multithreading

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

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

3 个答案:

答案 0 :(得分:17)

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

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

(正确地说我应该说:系统可以在同一个系统线程中执行托管线程或使用多个系统线程对于多个托管线程。)

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

答案 1 :(得分:11)

这不是一个糟糕的第一个问题。 1

我建议你阅读Threading in C# by Joseph Albahari。如果你仔细阅读帖子,你会发现:

  

线程如何运作

     

多线程由线程调度程序a内部管理   功能CLR通常委托给操作系统。 A.   线程调度程序确保分配适当的所有活动线程   执行时间,以及正在等待或阻塞的线程(for   实例,在独占锁或用户输入上)不消耗CPU   时间。

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

此外帖子还有:

  

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

答案 2 :(得分:11)

  

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

     

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

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

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

TPL解决的一些问题是:

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