|
|
1
15
为了确定如何有效地执行多线程,您确实需要进行大量的研究。有一些好的 technical articles 的一部分 Microsoft Parallel Computing team's site . 在我的头上,有几种方法可以进行多线程处理:
更新:有篇文章 Understanding and Applying Parallel Patterns with the .NET Framework 4 可供下载,提供了某些方向的解决方案,可用于哪些类型的并行方案(尽管它假定.NET 4,不包括RX)。 |
|
|
2
11
严格来说,这里应该区分并行、异步和并发。 并行意味着一个“任务”被分成几个较小的子任务,这些子任务可以同时运行。这需要多核CPU或多CPU计算机,其中每个任务都有其专用的核心或CPU。或多台计算机。plinq(数据并行)和tpl(任务并行)属于此类。 异步意味着任务运行时不会相互阻塞。f的异步表达式、rx、开始/结束模式都是异步编程的API。 并发性是一个比并行和异步更广泛的概念。 并发性意味着几个“任务”同时运行,彼此交互。但这些“任务”不必运行在单独的物理计算单元上,这在并行化中是有意义的。例如,多任务操作系统可以使用时间片在单核单CPU计算机上同时执行多个进程。 例如,可以通过actor模型和消息传递(例如f的邮箱、erlang进程(retlang in.net))实现并发性。 与上面的概念相比,线程是一个相对低级的概念。线程是在进程内运行的任务,同时运行,由操作系统的调度程序直接管理。当操作系统通过在每个线程上实现消息队列、路由等,将每个线程映射到单独的核心或参与者模型时,可以实现并行化。 |
|
|
3
4
还有一些面向图形处理单元(GPU)的.NET数据并行编程库,包括: Microsoft Accelerator 用于数据并行编程,可以针对GPU或多核处理器。 Brama 用于在GPU上运行的LINQ样式的数据转换。 CUDA.NET 提供允许从.NET程序使用CUDA的包装。 |
|
|
4
3
还有 Reactive Extensions for .NET (Rx) RX基本上是事件的LINQ查询。它允许您以LINQ允许您处理集合的相同方式处理和组合异步数据流。因此,您可能会将它与其他并行技术结合使用,将并行操作的结果结合在一起,而不必担心锁和其他低级线程原语。 Expert to Expert: Brian Beckman and Erik Meijer - Inside the .NET Reactive Framework (Rx) 很好地概述了RX的意义。 编辑: 另一个值得一提的库是并发和协调运行时(ccr),它已经存在很长时间了(早于06年),并作为 Microsoft Robotics Studio . RX有很多和CCR一样酷的想法,但在我看来,它有一个更好的API。不过,中央控制室里还有一些有趣的东西,所以可能值得一看。还有一个分布式服务框架可以与CCR一起工作,这可能会使它变得有用,这取决于您正在做什么。 Expert to Expert: Meijer and Chrysanthakopoulos - Concurrency, Coordination and the CCR |
|
|
5
2
另一个是.NET 4.0中的新任务并行库,它与您已经发现的内容类似,但这可能是一本有趣的书: |
|
|
6
-1
两种主要的并行方法是线程和新的基于任务的库TPL。 您提到的异步编程只不过是线程池中的一个新线程。 plinq、rx和其他提到的实际上是位于新任务调度程序顶部的扩展。 这里有一篇最好的文章,它精确地解释了新的任务调度程序和它上面的所有库、Visual Studio 2010和新的TPL.NET 4.0基于任务的并行性的新体系结构(由微软并行开发工具产品单元经理Steve Teixeira撰写): http://www.drdobbs.com/visualstudio/224400670 否则,Dobbs博士在这里有专门的并行编程部分: http://www.drdobbs.com/go-parallel/index.jhtml say线程和新的基于任务的并行编程之间的主要区别在于,您不再需要考虑线程、如何管理池、底层操作系统和硬件。TPL负责你只使用任务。这是您在任何级别(包括抽象)上并行操作方式的巨大变化。 所以在.NET中,实际上您没有很多选择:
显然,基于任务的方法是可行的。 干杯 瓦尔科 |