并发编程的方向
多线程
线程是一个独立的运行单元,是操作系统中能够进行运算调度的最小单位,它包含于进程之中,是进程中的实际运行单位。每个线程都有自己独立的栈,但是与进程内的其他线程共享内存。现在的.NET程序都维护了一个线程池,里面有着一定数量的工作线程,这些线程等待着执行分配下来的任务,线程池也可以随时监测线程的数量,以备开发者根据业务情况灵活处理。
并行编程
并行编程主要用于分解计算密集型的任务片段,并将其分配给多个线程。前提是,程序中的任务可以分割成多个相互独立的任务块,关键字是相互独立,如果依赖太大,就不适合用并行编程。
并行编程利用CPU的空闲资源,充分提高了CPU的利用率,提高了系统的吞吐量。在大多数情况下,服务器本身就已经具备了并行处理能力,当通过编程进行并行处理的时候,需要慎重,因为使用不当将会导致内存溢出等风险,同时也会因为占用服务器资源而导致服务器本身的并行处理能力显著下降,严重的时候回导致系统无法使用。所以在进行编程的时候,尽量不要处理过长或者过短的任务。
并行处理分为数据并行和任务并行,其实他们都使用到了动态调整的分割算法,在任务分割后分配给工作线程。可以通过以下两种方式实现并行编程,一种是Parallel.ForEach以及更加优美的PLINQ,这是并行编程的推荐处理方式,并且它们自带自动分配任务的算法,可以在运行时进行调整;
在编写并行任务的时候,需要注意的是闭包所带来的风险。因为闭包捕获的是引用而不是值,所以可以在不经意间共享这些变量。一个比较好的处理就是,在使用闭包外的变量的时候,可以在闭包内定义局部变量,用以规避闭包带来的变量共享问题。










