Chinaunix首页 | 论坛 | 博客
  • 博客访问: 507407
  • 博文数量: 158
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 904
  • 用 户 组: 普通用户
  • 注册时间: 2016-10-10 11:17
文章分类

全部博文(158)

文章存档

2018年(74)

2017年(84)

我的朋友

分类: C/C++

2018-05-29 15:15:52

《C#多线程编程实战》(原书第2版)是一本由机械工业出版社出版的关于C#多线程编程主题的新书。这个主题,网上可以搜索到大量的技术文章和帖子,但往往都比较陈旧或者零散。该书除了内容比较新之外(支持Visual Studio 2015),最突出的特点就是比较全面,涵盖了C# 6.0以内所有与C#多线程编程相关的技术。对于希望全面了解该主题的C#开发人员,还是一个不错的选择。

本书从线程基础、线程同步将起,进而过渡到线程池、关于异步操作的任务并行库以及C# 6.0中新增的关于异步编程的语法和库。从第六章开始,介绍了并发集合、PLINQ及Reactive Extensions等用于提高异步编程开发效率的实用库,异步I/O的常用场景和常见的并行编程模式。最后一章,介绍了在Windows 10、Mac、Linux等不同操作系统平台上使用异步编程的一些范例。

接下来,让我们一起来领略一下该书的部分核心内容。
      本文转自-学领未来

C# 多线程基础

第1章 线程基础。包括线程的创建、暂停、等待、终止与状态检测。前台线程和后台线程的区分,如何向线程传递参数,lock关键字的使用与原理,使用Monitor类锁定资源,线程相关异常的处理。

众所周知,lock语句可以确保一个线程使用某些资源时,其他线程无法同时使用该资源。但lock的误用,很容易导致性能问题。有些场景下,使用Monitor这个具有更精细控制粒度的类来锁定资源,往往可以减少死锁的发生。下图展示了Monitor类的使用示例:

image001.jpg

 

图一:Monitor类的使用示例

第2章 线程同步。原子操作的定义,线程同步的核心类:Mutex类、SemaphoreSlim类、AutoResetEvent类 / ManualResetEventSlim类,CountDownEvent类,Barrier类,ReaderWriterLockSlim类,SpinWait类,以及把这些核心组件组织成一个有机整体的各项规则。下图展示了Mutex类的使用示例:

image002.jpg

图二:Mutex类的使用示例

使用线程池

第3章 线程池。创建新线程是一项高开销的操作。若临时需要创建大量的线程,可能造成较大的延迟。线程池的出现,很好的缓解了类似场景的困境。其基本原理是提前创建出所需的多个线程、按需使用,使用过后放回池中并不立即销毁等待再次使用。这样一来,可以有效缓和由于线程频繁创建与销毁对应用程序执行性能的严重影响。

线程池是一种技术解决方案,不要把线程池等同于ThreadPool类型。后者只是线程池技术的一种实现而已,如果需要,你也可以实现自定义的线程池(往往是围绕某个核心类的一组类与接口等)。下图展示了线程池的使用示例:

image003.jpg

图三:线程池的使用示例

使用任务并行库

第4章 任务并行库。线程池可以理解为一个抽象层,向程序员隐藏了多线程操作的细节,但实际使用当中复杂度仍然不小,例如从某个工作线程中获取工作成果、或将工作线程中发生的异常传递给主线程等等。

自.NET Framework 4.0起,引入了一套新的异步操作API,称为任务并行库(Task Parallel Library,简称TPL)。TPL可以理解为在线程池基础之上的进一步封装,提供了更加细粒度的API。TPL的核心是“任务”,一个任务代表一个异步操作,可以通过多种方式运行,可以选择使用或不使用独立线程来运行。任务还可以轻松的进行组合,这也是TPL较以往的技术相比的一个突出优势之一。下图展示了TPL的使用示例:

image004.jpg

图四:任务并行库的使用示例

小结

随着多核心CPU的普及与常态化,多线程编程技术已成为企业级开发中一块需要专题研究并应用的环节。不仅是C#,其他主流开发语言大都提供了多线程开发的支持,以便充分利用硬件的性能。

本文限于篇幅无法深入展开,只是带领大家管中窥豹、领略该书几点精彩之处,进而激发大家的学习兴趣。更多的内容,推荐购买正版书籍进行精读、结合配套源码与工作实际进行钻研。

后续若有合适的时机,我们可以继续这个话题的探讨。

 

参考文档:

原书配套的源代码使用Visual Studio 2015编写,可从书中首部所提供的“华章程序员书库”网址获取:

 

阅读(1286) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~