C# 并行编程

article/2025/9/13 14:48:52

一 并行任务库TPL

在这里插入图片描述

1 并行任务库(TPL,Task Parallel Library)

2 最重要的是Task类,还有Parallel类

3 Task类,是利用线程池来进行任务的执行

比如直接用ThreadPool更优化,而且编程更方便

4 Paallel类,是并行执行任务类的实用类

好处是可以隐式地实用Task,更方便。

二 Task类的使用

1 使用Task.Run方法来得到Task的实例

2 Tasktask=Task.Run()=>SomeFun());

3 可以使用Task.WaitAll(task数组)

4 可以使用task.ContinueWith(另一个task)

5 Task中的异常

可以使用AggregateException(合并的异常)

try
{Task.WaitAll(task1,task2,task3);
}
catch (AggregateException ex)
{foreach (Exception inner in ex.InnerException){Console.WriteLine("Exception type{0} from {1}",inner.GetType(),inner.Source);}
}

三 Parallel类的使用

Parallel.Invoke(Action[] actions);//并行执行多个任务,直到完成
Parallel.For(0,100,i>={…})
Parallel.ForEach(list,item=>{…})

四 并行Linq

1 并行Linq(即PLinq)

2 只要在集合上加个.AsParallel()

var a=(from n in persons.AsParallel()
where n.Age>20&&n.Age<25
select n)
.ToList();

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;namespace 使用Task
{internal class Program{static void Main(string[] args){Task<double>[] tasks ={Task.Run(()=>SomeFun()),Task.Run(()=>SomeFun()),};Thread.Sleep(1);for(int i=0;i<tasks.Length;i++){Console.WriteLine(tasks[i].Status);//可以查看状态Console.WriteLine(tasks[i].Result);//取Result时,会等到计算结束}Task.WaitAll(tasks);//也可以用这句,来等结束Console.ReadKey();}static void DoSometing() { }static double SomeFun() { Thread.Sleep(50);return 0; }}
}
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace 并行计算矩阵乘法
{internal class Program{static void Main(string[] args){int m = 100, n = 400, t = 1000;double[,] ma = new double[m, n];double[,] mb = new double[n, t];double[,] r1 = new double[m, t];double[,] r2 = new double[m, t];InitMatrix(ma);InitMatrix(mb);InitMatrix(r1);InitMatrix(r2);Console.WriteLine("矩阵乘法");Stopwatch sw = new Stopwatch();sw.Start();MultiMatrixNormal(ma, mb, r1);sw.Stop();Console.WriteLine("普通方法用时" + sw.ElapsedMilliseconds);sw.Restart();MultiMatrixParallel(ma, mb, r2);sw.Stop();Console.WriteLine("并行方法用时" + sw.ElapsedMilliseconds);bool ok = CompareMatrix(r1, r2);Console.WriteLine("结果相同" + ok);Console.ReadKey();}static Random rnd = new Random();static void InitMatrix(double[,] matA){int m = matA.GetLength(0);int n = matA.GetLength(1);for (int i = 0; i < m; i++){for (int j = 0; j < n; j++){matA[i, j] = rnd.Next();}}}static void MultiMatrixNormal(double[,] matA, double[,] matB, double[,] result){int m = matA.GetLength(0);int n = matA.GetLength(1);int t = matB.GetLength(1);for (int i = 0; i < m; i++){for (int j = 0; j < t; j++){double temp = 0;for (int k = 0; k < n; k++){temp += matA[i, k] * matB[k, j];}result[i, j] = temp;}}}static void MultiMatrixParallel(double[,] matA, double[,] matB, double[,] result){int m = matA.GetLength(0);int n = matA.GetLength(1);int t = matB.GetLength(1);Parallel.For(0, m, i =>{for (int j = 0; j < t; j++){double temp = 0;for (int k = 0; k < n; k++){temp += matA[i, k] * matB[k, j];}result[i, j] = temp;}});}static bool CompareMatrix(double[,] matA,double[,] matB){int m = matA.GetLength(0);int n = matA.GetLength(1);for(int i=0;i<m;i++){for(int j=0;j<n;j++){if (Math.Abs(matA[i, j] - matB[i, j]) > 0.1)return false;}}return true;}}
}

http://chatgpt.dhexx.cn/article/TG26Ngcp.shtml

相关文章

并行处理及分布式系统

并行处理及分布式系统 1 为什么要并行计算 1.1 为什么需要不断提升性能 随着计算能力的增加&#xff0c;我们所面临的计算问题和需求也在增加随着技术的进步&#xff0c;我们从未想过的技术得到了解决&#xff0c;比如&#xff1a;人类基因解码、更准确的医疗成像、更快速准…

并行计算之MPI(一)

MPI学习 1. 了解并行计算 为什么要采用并行计算&#xff1f; &#xff08;1&#xff09;这是因为它可以加快速度即在更短的时间内解决相同的问题或在相同的时间内解决更多更复杂的问题特别是对一些新出现的巨大挑战问题&#xff1b; &#xff08;2&#xff09;节省投入并行计…

并行网关

1、并行网关 假设现在我们想在旁边放一份沙拉。无论如何&#xff0c;如果你想要沙拉&#xff0c;你可以像我们在图1.1中所做的那样建模。 图1.1:准备沙拉和主菜。 在这里&#xff0c;我们介绍了另一个符号&#xff1a;(文本)注释&#xff1b;这是一个您可以与任何流对象(在本…

并行计算:循环程序并行化的一般方法

一、数据划分和处理器指派 1. 带状划分方法 又叫做行列划分&#xff0c;就是将矩阵的整行或整列分成若干组&#xff0c;各组指派给一个处理器。 例如&#xff1a;设矩阵A由n行和m列&#xff0c;对其串行处理的程序段如下&#xff1a; for i1 to n dofor j1 to m doProcess(a[…

并行计算之MPI(三)

了解MPI 什么是MPI &#xff08;1&#xff09;MPI是一个库而不是一门语言&#xff0c;许多人认为MPI就是一种并行语言&#xff0c;这是不准确的。但是按照并行语言的分类可以把FORTRANMPI或CMPI。看作是一种在原来串行语言基础之上扩展后得到的并行语言&#xff0c;MPI库可以被…

并行计算的一些思考与总结

弗林分类法 根据弗林分类法&#xff0c;计算机结构主要分为 SIMD----单指令、多数据MIMD---多指令、多数据SISD----单指令、单数据MISD---多指令、单数据 一般的串行程序中为SISD&#xff0c;即在单核CPU下任何时间和地点只有一个指令处理一个数据&#xff0c;其所谓的多线程…

并行计算之MPI(二)

1.并行编程模型 目前两种最重要的并行编程模型是数据并行和消息传递数据并行编程模型的编程级别比较高编程相对简单但它仅适用于数据并行问题消息传递编程模型的编程级别相对较低但消息传递编程模型可以有更广泛的应用范围。 数据并行即将相同的操作同时作用于不同的数据因此…

Matlab 并行

Matlab 并行 1. 检查是否有并行附加功能2. 创建和删除并行2.1 创建默认的并行池2.2 在本地创建2.3 在集群创建2.4 删除 3. Parallel pool 包含的一些函数3.1 parfor3.2 parfeval 初学&#xff0c;肯定有理解不够的地方。看官方文件更靠谱。 1. 检查是否有并行附加功能 如果没有…

并行处理及分布式系统期末总结笔记

并行处理及分布式系统期末总结笔记 1、任务并行、数据并行的应用2、冯诺依曼体系结构的瓶颈及改进&#xff0c;Flynn分类法涉及的几种模型及其特点3、Cache的特点&#xff0c;Cache缺失、Cache命中、Cache一致性及解决方法、伪共享、流水线、多发射4、加速比、效率、阿姆达尔定…

并行程序设计导论期末复习

任务并行、数据并行的应用 任务并行 将待解决问题所需要执行的各个任务分配到各个核上执行。 数据并行 将待解决问题所需要处理的数据分配给各个核&#xff0c;每个核在分配到的数据集上执行大致相似的操作。 冯诺依曼体系结构的瓶颈及改进&#xff0c;Flynn分类法涉及的几…

并行程序设计导论 概念总结

Parallel Programing caiyi 2021/6/17 第一章 1.为什么要构建并行系统? 电路晶体管密度过大会使处理器能耗增加&#xff0c;散热的问题使通过继续增快集成电路密度提高处理器性能不再现实&#xff0c;因此集成电路商决定构建多核处理器。 2.为什么要编写并行程序&#xf…

cuda 并行计算

1 简介 2006年&#xff0c;NVIDIA公司发布了CUDA&#xff0c;CUDA是建立在NVIDIA的GPU上的一个通用并行计算平台和编程模型&#xff0c;基于CUDA编程可以利用GPU的并行计算引擎来更加高效地解决比较复杂的计算难题。CUDA是NVIDIA公司所开发的GPU编程模型&#xff0c;它提供了GP…

数据 并行

first 含义是计算机内包含一组处理单元&#xff08;PE&#xff09;&#xff0c;每一个处理单元存储一个&#xff08;或多个&#xff09;数据元素。当机器执行顺序程序时&#xff0c;可对应于全部或部分的内部处理单元所存的数据同时操作。 将并行处理技术引入信息检索领域 把数…

并行的常见问题和注意事项

关于Oracle中的并行&#xff0c;可以说是一把双刃剑&#xff0c;用得好&#xff0c;可以充分利用系统资源&#xff0c;提升数据库的处理能力&#xff0c;用得不好&#xff0c;可能会适得其反。 并行的基本使用方法&#xff0c;对于大部分SQL开发者和DBA来说&#xff0c;并行的一…

并发和串行、并行的概念

先抛开语言不管&#xff0c;只聊概念&#xff0c;说起并发&#xff0c;就很容易想到它和串行、并行的区别。 串行&#xff1a;一次只能取得一个任务并执行这个任务&#xff0c;这个任务执行完后面的任务才能继续&#xff1b; 并发&#xff1a;指的是在同一个时间段内&#xf…

牛腩新闻发布--过程或函数 'news_selectByCaId' 需要参数 '@caid',但未提供该参数(二)

发现问题 之前有一篇博客是因为存储过程中没有添加相应的函数&#xff0c;导致出现了“过程或函数 ‘news_selectByCaId’ 需要参数 ‘caid’&#xff0c;但未提供该参数”&#xff0c;这次继续出现了这样一个问题&#xff0c;但是出现的错误就不再过程函数中了&#xff0c;而…

牛腩新闻发布--过程或函数 'news_selectByCaId' 需要参数 '@caid',但未提供该参数(三)

发现问题 这篇博客是建立在“牛腩新闻发布–过程或函数 ‘news_selectByCaId’ 需要参数 ‘caid’&#xff0c;但未提供该参数&#xff08;二&#xff09;”&#xff0c;因为在那篇博客中说出了我当时遇到的“过程或函数 ‘news_selectByCaId’ 需要参数 ‘caid’&#xff0c;…

【牛腩】-'T_news_selectByCaId' 需要参数 '@caid',但未提供该参数。”

问题截图 解决方案&#xff1a; 改动存储过程 BEGINselect n.id,n.title,n.createTime,c.[name],n.caId from T_news ninner join T_category c on n.caIdc.id and n.caIdcaidorder by n.createTime desc END检查传参是或否正确如果以上都没有错误&#xff0c;那就看一下是否…

【重要补充】关于第三方潜在SDK导致的5.1.2Data use sharing

接上一篇《关于IDFA、CAID和「5. 1.2 - Data use & sharing」》后&#xff0c;我们发现&#xff0c;苹果在14.5出来前&#xff0c;对于IDFA替代方案之数据收集的审核打击力度越来越大。 因5.1.2条款被拒&#xff0c;目前可以确认的原因有以下两大&#xff1a; 一、如果你…

spring笔记⑬——spring事务

事务的四个特征 CAID是事务的四个特征&#xff0c;所有事务都必须满足以下特性。 原子性&#xff08;Atomicity&#xff09;&#xff1a;一个事务要么全部执行&#xff0c;要么不执行一致性(Consistency)&#xff1a;事务的运行并不改变数据库中数据的一致性隔离性&#xff0…