第十三章 并发编程
并发编程或者说是多线程编程,可以有效的减少系统响应时间,增加系统吞吐量。
一些关于编写并发软件的中肯说法:
1. 并发会在性能和编写额外代码上增加一些开销。
2. 正确的并发是复杂的,即便是对于简单问题也是如此。
3. 并发缺陷并非总能重现,所以常被看作偶发事件而忽略,未被当作真的缺陷看待。
4. 并发常常需要对设计策略的根本性修改。
并发防御的原则
- 单一职责原则。要满足这个原则就要尽量分离并发相关代码与其他代码。
- 限制数据作用域。要限制临界区的数量,共享数据的地方越多就越容易出错。
- 使用数据复本。这样可以避免多个线程同步数据的麻烦,例如可以将数据复制给不同的线程已只读方式对待之,或者多个线程收集复本的结果,在某一个线程中合并。
- 线程应该尽可能的独立。减少线程间的通信,尝试将数据分解到可被独立线程操作的独立子集。
常见的执行模型
首先是关于线程的一些基础定义。
常见的线程模型,不在此做过多的讨论。
1. 生产者消费者模型。
2. 读者作者模型。
3. 宴席哲学家。
测试线程代码
- 将伪失败看作可能的线程问题。
- 先使非线程代码可工作。
- 编写可插拔的线程代码。
- 编写可调整的线程代码。
- 运行多与处理器数量的代码。
- 在不同平台上运行。
- 调整代码并强迫错误发生。
- 添加试错代码:通过硬编码和自动化。
总之
并发代码很难编写正确,所以不可以忽略任何在系统初期表现出来的偶然的疑似线程方面的问题,这种问题往往会随着系统复杂读的不断提高而藏得越来越深,长痛不如短痛,前期酒保保证并发模块不存在任何潜在的问题,同时要尽量保持并发代码和非并发代码的独立性,就如所有设计模式都在干的一件事:封装变化。