C# 并行编程概念介绍

C# 并行编程

1.同步与异步(客户端)

关注消息通信机制
同步:主程序会等待被调用的方法按顺序执行完,才会继续执行。
异步:主程序不会等待方法执行完,而是主程序调用异步方法后直接继续运行。
异步方法会启动一个新线程来完成方法的计算。主要用于IO密集型计算。

2.阻塞与非阻塞(服务器端)

关注程序在等待调用结果(消息,返回值)时的状态
阻塞:指调用结果返回之前,当前线程会被挂起。调用线程只有在得到结果之后才会返回。
非阻塞:指在不能立刻得到结果之前,该调用不会阻塞当前线程。

3.并行编程

3.1硬件线程与软件线程

多核处理器带有一个以上的物理内核,每个物理内核都可能会提供多个硬件线程,也称之为逻辑内核或者逻辑处理器。
Windows中每个运行的程序都是一个进程(process),每个进程都会创建并运行一个或者多个线程,也被称为软件线程。
当Windows调度器运行在多核微处理器上时,调度器必须从物理内核支持的硬件线程中分配时间给一个需要运行指令的软件线程。

线程的局限性:线程完成后无法再次启动,只能join(阻塞当前操作线程),并发操作需要手动同步处理(锁/信号发送)

3.2基于任务的并行

不考虑子问题任务的执行顺序,避免任务与任务之间的依赖性。
默认情况下,CLR会将任务运行在线程池线程上,这种线程非常适合执行短小的计算密集的任务。
如果运行的是I/O密集型任务,则使用TaskCompletionSource和异步函数(asynchronousfunctions)通过回调函数而非使用线程实现并发性。
如果任务是计算密集型,则使用生产者/消费者队列可以控制这些任务造成的并发数量,避免出现线程和进程饥饿的问题 BlockingCollection

3.3多线程

多个线程执行

3.4多进程

执行多个程序

4.线程池

执行方式:Task.Run() 与ThreadPool.QueueUserWorkItem()
线程池本身就是一个生产者/消费者队列,并特别针对短时计算密集型任务进行了优化
线程池可用于执行任务、发送工作项、处理异步 I/O、代表其他线程等待以及处理计时器。线程池其实就是一个存放线程对象的容器。
优点:线程池中的线程执行完指定的方法后并不会自动消除,而是以挂起状态返回线程池,如果应用程序再次向线程池发出请求,那么处以挂起状态的线程就会被激活并执行任务,而不会创建新线程,这就节约了很多开销。只有当线程数达到最大线程数量,系统才会自动销毁线程。因此,使用线程池可以避免大量的创建和销毁的开支,具有更好的性能和稳定性。保证临时性的计算密集作业不会导致CPU超负荷。线程启动需要时间创建新的局部变量栈,线程池预先创建一个可回收线程的池子来降低这个开销。
缺点:无法设置线程优先级及Name属性,增加调试难度。线程池中的线程都是后台线程。 阻塞线程池中的线程将影响性能。

5.Parallel

适用于计算密集型任务
使用Parallel.For、Parallel.ForEach的循环迭代的并行执行,TPL(任务并行库)会在后台创建System.Threading.Tasks.Task的实例。

使用Parallel.Invoke时,TPL也会创建与调用的委托数目一致的System.Threading.Tasks.Task的实例。

6.Task

任务并不是线程(任务运行的时候需要使用线程,但并不是说任务取代了线程,任务代码是使用底层的线程(软件线程,调度在特定的硬件线程或逻辑内核上)运行的,任务与线程之间并没有一对一的关系。)
一个Task表示一个异步操作。
Task.Run Task.Factory.StartNew(重载版本更多)
Task默认使用线程池中的线程,它们都是后台线程。这意味着当主线程结束时,所有的任务也会随之停止。

7.PLINQ并行查询

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值