2006年11月10日

关于并发程序设计(二)

并发程序设计的领域,有三个牛人

Doug Lea (Java util.concurrent)
Douglas C. Schmidt (ACE、POSA2)
Herb Sutter (C++/CLI concurrent)


Doug Lea

Doug_Lea.jpg
util.concurrent包的作者,JSR166规范的制定。图书著作《Concurrent Programming in Java: Design Principles and Patterns》。在JDK 1.6的源码中,还看到他修改的代码(例如重写Exchanger,修正N parters时死锁的问题)。随着JDK 1.5、1.6的普及推广,他的思想,他的作品,都将产生极大的影响。


Douglas C. Schmidt

douglas.jpg
他创造了ACE,一个流行开源跨平台的C++网络框架。他的图书著作:
《C++ Network Programming: Mastering Complexity Using ACE and Patterns》
《C++ Network Programming: Systematic Reuse with ACE and Frameworks》
《Pattern-Oriented Software Architecture: Patterns for Concurrent & Networked Objects》
他的成果:
Leader/Follow模式
ACE Reacotr
ACE Proactor
虽然ACE中也包括Acitve Object、Future等,他的书中也讲述了基于事件/基于任务的模型,但这些并非他的创造。

Douglas C. Schmidt的成果是网络、并发、跨平台。 Douglas C. Schmidt创造辉煌的时刻已经过去了。

Herb Sutter

hps-small.jpg.gif
ISO C++标准委员会主席,微软C++/CLI首席架构师,Exceptional三卷书的作者,目前领导微软的concur Project。从2005年开始,他一直发表一些预告并发时代来临的文章。2005年,他代表Microsoft参加OOPSLA,主题就是关于C++ /CLI的并发。Herb Sutter是我极为敬仰的牛人!

他的网站:
http://www.gotw.ca/

posted @ 2006-11-10 13:09 温少 阅读(700) 评论(1) 编辑

关于并发程序设计 (一)

Herb Sutter的观点

Herb Sutter最近的一篇文章中如是说:“90年代,我们到处跟人叫讲,什么是对象,什么是虚函数,现在我们到处跟人说,什么是主动对象,什么是Future”,他还说,结构编程、面向对象,现在该轮到并发和并行了。

记得在去年,Herb Sutter就写文章预示并发时代的到来,主要是因为CPU的主频将不再会有以前那样的增长速度,而将迎来多核时代。程序将是靠并发来提高运行效率。



JDK 1.5 Concurrent包

在传统的多线程程序中,经常会有:
创建线程
wait\notify
重新发明轮子,例如BlockingQueue、Lock、Semaphore这样的基本工具类。

不恰当的抽象,会导致难以承受的复杂度,代码错误多,常犯死锁、lost notify之类,也很容易导致性能低下。我也有过这样的经历,失败的教训刻骨铭心。

JDK 1.5 util.concurrent包提供了一系列工具类,其中一些类的使用,代表一些观念的转变,更好的抽象,优雅的设计模式,会使多线程程序具有良好的结构。

使 用Excector、ScheduleExecutorService、Future、BlockingQueue等类搭建起来的程序,会使得多线程程序 有很清晰明了的结构。其中的差别,似乎就象以前“非结构化程序设计”到“结构化程序设计”那样的转变,现在我们使用Future等设计模式,起到了同样好 的效果。

结构化程序设计,使用if/else、while、do...while、for、switch等结构,把程序组织的清晰易懂,更容易掌握,更少出错。
Executor、Future、Concurrent Collection等工具类、模式,使得并发程序结构清晰化/模式化,更容易掌握,更少出错,也更高效。

随着多核CPU的普及,摩尔定律逐步失效,并发程序设计将会是程序员要求掌握的基本技巧,就如同现在程序员要求掌握面向对象一样。

有几个文档值得一看的:

javaone的幻灯片
http://developers.sun.com/learning/javaoneonline/2005/coreplatform/TS-3423.pdf
http://developers.sun.com/learning/javaoneonline/2005/coreplatform/TS-5807.pdf

Doug Lea的文章
http://gee.cs.oswego.edu/dl/papers/aqs.pdf

上面的文档只能给你一个介绍,最好的办法还是通读一遍JDK 1.5 utilconcurrent包的源码,然后在实践中,改变观念,积累经验。


并发和网络编程

网 络中,存在中心服务器,不同机器的交互,并发和异步是常见行为。网络中的服务器,需要相应大量的并发,这种并发通常会是极端的并发,操作系统提供一些特别 的API,例如select模型,poll,windows的完成端口等等。JDK在1.4之后支持nio,主要也是针对大并发的支持。

C++的框架ACE,提供了跨平台的线程、进程、Future等API,并且提供了Reactor、Proactor等框架,使得能够容易编写跨平台的并发网络服务器。

ACE框架的一个思想就是,使用ACE和模式消除复杂性。这一点和JDK 1.5 concurrent包提供的高级设计模式类的意图是一致的。

在《C++网络编程》卷1和卷2中讲述了一些模式,例如Half Sync/Aysnc vs Leader/Follow模式。这是ACE开发过程中的一些研究成果,我们查找ACE相关资料时,会发现一些关于并发方面的论文。ACE也提供了Future。

我才运用ACE作了一些简单的应用,了解还不够深入,不过觉得JDK concurrent包在并发设计模式方面,比ACE走到更远。


今天,你使用Future了吗?




posted @ 2006-11-10 03:23 温少 阅读(2648) 评论(3) 编辑