使用多线程的 原因
- 对于需要等待的操作,例如:文件、数据库、网络访问。启动一个新线程,与此同时,可以去完成其他事情。
- 对于处理密集型的操作,使用多线程也有帮助。一个进程的多个线程可以同时运行在:
- 不同的CPU上
- 多核CPU的不同内核上
使用多线程的 注意事项
为避免同步问题,最好不要在线程之间共享数据。当然,这并不总是可行。
- 如果线程访问相同的数据,就必须实现同步机制
如果需要共享数据,就必须使用同步技术,确保一次只有一个线程访问和改变共享状态
- 注意避免:条件争用和死锁
如果CPU核心比较多,错误数量就会增加
尽可能的使用不可变的类型,可能部分地避免同步问题。不可变类型,无需同步。
任务
.NET 提供了线程的抽象机制:任务
- 允许建立:
- 任务之间的关系。例如:任务的下一个任务
- 一个层次结构,其中包含多个任务
Parallel类
除了使用任务,还可以使用
Parallel
类 实现并行活动
并行
数据并行:在不同的任务之间同时处理一些数据
任务并行: 同时执行不同的功能
选择什么技术 实现并行
Parallel
类提供了非常简单的并行性- 如果需要更多的控制,就要使用任务
Task
。例如:- 管理任务之间的关系
- 定义返回任务的方法
- 数据流库,用于通过管道传送数据
Parallel LINQ
Parallel LINQ 提供了任务并行的一种变体
同步选项之一:同步对象
同步对象,可以用来:
- 在一个进程中或跨进程,
- 同步一个任务或多个任务,
- 来访问一个或多个资源 也可以用来:
- 通知完成的任务