.NET在开发多线程应用程序和并行编程之间有什么区别?

Ful*_*oof 6 c# parallel-processing concurrency multithreading task-parallel-library

最近我已经阅读了很多关于.NET中的并行编程的内容,但我仍然对这个主题的文本中的语句相矛盾.

例如,弹出(在鼠标指向标记的图标上时)stackoverflow.com task-parallel-library标记的描述:

"任务并行库是.NET 4的一部分.它是一组API,使开发人员能够编写多核共享内存处理器"

这是否意味着使用早期版本的.NET无法实现多核d和并行编程应用程序?

我是否在.NET多线程应用程序中控制核心之间的多核/并行使用/分配?

如何识别要运行线程的核心并将线程归属到特定核心?

什么启用了.NET 4.0+任务并行库,这在以前的.NET版本中是不可能的?

更新:
嗯,很难提出具体问题,但我想更好地理解:

.NET在开发多线程应用程序和并行编程之间有什么区别?

到目前为止,我无法理解它们之间的区别

Update2:
MSDN ".NET Framework中的并行编程"从.NET 4.0版本开始,其文章任务并行库告诉:

"从.NET Framework 4开始,TPL是编写多线程和并行代码的首选方式"

您是否可以提示如何在.NET4之前(在.NET3.5中)专门创建并行代码,同时考虑到我熟悉多线程开发?

Ste*_*ary 12

我认为"多线程"就像术语所说的那样:使用多线程.

"并行处理"将是:在多个线程之间拆分一组工作,以便可以并行处理工作.

因此,并行处理是多线程的一种特殊情况.


这是否意味着使用早期版本的.NET无法实现多核d和并行编程应用程序?

一点也不.你可以用这个Thread课来做.写起来困难得多,而且难以理解.

我是否在.NET多线程应用程序中控制核心之间的多核/并行使用/分配?

不是真的,但你不需要.您可以为应用程序处理器处理器关联性,但在.NET级别,这几乎不是一个成功的策略.

任务并行库包括一个"分区器"概念,可用于控制工作分配,这是一种更好的解决方案,可以控制线程在核心上的分布.

如何识别要运行线程的核心并将线程归属到特定核心?

你不应该这样做..NET线程不一定与OS线程对应; 你处于比这更高的抽象层次.现在,默认的.NET主机确实将线程1对1映射,因此如果您想依赖于未记录的实现细节,那么您可以查看抽象并使用P/invoke来确定/驱动您的处理器关联.但如上所述,它没用.

什么启用了.NET 4.0+任务并行库,这在以前的.NET版本中是不可能的?

没有.但它确实使并行处理(和多线程)变得更加容易!

您是否可以提示如何在.NET4之前(在.NET3.5中)专门创建并行代码,同时考虑到我熟悉多线程开发?

首先,没有理由为该平台开发.没有..NET 4.5已经发布,最后一个版本(.NET 4.0)支持下一个旧版本(.NET 3.5)所做的所有操作系统.

但是如果你真的想要,你可以通过旋转Thread对象或BackgroundWorkers,或者通过将工作直接排队到线程池来进行简单的并行处理.所有这些方法都需要比TaskTPL中的类型更多的代码(特别是在错误处理方面).


Tal*_*ner 5

如果我问你"你用自己开发的语言编写商业软件吗?或者你在挖掘自己的井后喝水了怎么办?"

这是通过创建线程并管理它们来编写多线程的不同之处,而您可以使用TPL在线程上使用抽象.在内核上维护多核和线程上的线程调度,因此您无需担心线程是否在您的系统支持AFAIK的内核上执行.