Herb Sutter的觀點(diǎn)
Herb Sutter最近的一篇文章中如是說:“90年代,我們到處跟人叫講,什么是對象,什么是虛函數(shù),現(xiàn)在我們到處跟人說,什么是主動對象,什么是Future”,他還說,結(jié)構(gòu)編程、面向?qū)ο?,現(xiàn)在該輪到并發(fā)和并行了。
記得在去年,Herb Sutter就寫文章預(yù)示并發(fā)時(shí)代的到來,主要是因?yàn)镃PU的主頻將不再會有以前那樣的增長速度,而將迎來多核時(shí)代。程序?qū)⑹强坎l(fā)來提高運(yùn)行效率。
JDK 1.5 Concurrent包
在傳統(tǒng)的多線程程序中,經(jīng)常會有:
創(chuàng)建線程
wait\notify
重新發(fā)明輪子,例如BlockingQueue、Lock、Semaphore這樣的基本工具類。
不恰當(dāng)?shù)某橄?,會?dǎo)致難以承受的復(fù)雜度,代碼錯誤多,常犯死鎖、lost notify之類,也很容易導(dǎo)致性能低下。我也有過這樣的經(jīng)歷,失敗的教訓(xùn)刻骨銘心。
JDK 1.5 util.concurrent包提供了一系列工具類,其中一些類的使用,代表一些觀念的轉(zhuǎn)變,更好的抽象,優(yōu)雅的設(shè)計(jì)模式,會使多線程程序具有良好的結(jié)構(gòu)。
使
用Excector、ScheduleExecutorService、Future、BlockingQueue等類搭建起來的程序,會使得多線程程序
有很清晰明了的結(jié)構(gòu)。其中的差別,似乎就象以前“非結(jié)構(gòu)化程序設(shè)計(jì)”到“結(jié)構(gòu)化程序設(shè)計(jì)”那樣的轉(zhuǎn)變,現(xiàn)在我們使用Future等設(shè)計(jì)模式,起到了同樣好
的效果。
結(jié)構(gòu)化程序設(shè)計(jì),使用if/else、while、do...while、for、switch等結(jié)構(gòu),把程序組織的清晰易懂,更容易掌握,更少出錯。
Executor、Future、Concurrent Collection等工具類、模式,使得并發(fā)程序結(jié)構(gòu)清晰化/模式化,更容易掌握,更少出錯,也更高效。
隨著多核CPU的普及,摩爾定律逐步失效,并發(fā)程序設(shè)計(jì)將會是程序員要求掌握的基本技巧,就如同現(xiàn)在程序員要求掌握面向?qū)ο笠粯印?br>
有幾個文檔值得一看的:
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包的源碼,然后在實(shí)踐中,改變觀念,積累經(jīng)驗(yàn)。
并發(fā)和網(wǎng)絡(luò)編程
網(wǎng)
絡(luò)中,存在中心服務(wù)器,不同機(jī)器的交互,并發(fā)和異步是常見行為。網(wǎng)絡(luò)中的服務(wù)器,需要相應(yīng)大量的并發(fā),這種并發(fā)通常會是極端的并發(fā),操作系統(tǒng)提供一些特別
的API,例如select模型,poll,windows的完成端口等等。JDK在1.4之后支持nio,主要也是針對大并發(fā)的支持。
C++的框架ACE,提供了跨平臺的線程、進(jìn)程、Future等API,并且提供了Reactor、Proactor等框架,使得能夠容易編寫跨平臺的并發(fā)網(wǎng)絡(luò)服務(wù)器。
ACE框架的一個思想就是,使用ACE和模式消除復(fù)雜性。這一點(diǎn)和JDK 1.5 concurrent包提供的高級設(shè)計(jì)模式類的意圖是一致的。
在《C++網(wǎng)絡(luò)編程》卷1和卷2中講述了一些模式,例如Half Sync/Aysnc vs Leader/Follow模式。這是ACE開發(fā)過程中的一些研究成果,我們查找ACE相關(guān)資料時(shí),會發(fā)現(xiàn)一些關(guān)于并發(fā)方面的論文。ACE也提供了Future。
我才運(yùn)用ACE作了一些簡單的應(yīng)用,了解還不夠深入,不過覺得JDK concurrent包在并發(fā)設(shè)計(jì)模式方面,比ACE走到更遠(yuǎn)。
今天,你使用Future了嗎?

文章來源:
http://www.cnblogs.com/jobs/archive/2006/11/10/556063.html
并發(fā)程序設(shè)計(jì)的領(lǐng)域,有三個牛人
Doug Lea (Java util.concurrent)
Douglas C. Schmidt (ACE、POSA2)
Herb Sutter (C++/CLI concurrent)
Doug Lea

util.concurrent包的作者,JSR166規(guī)范的制定。圖書著作《Concurrent Programming in Java:
Design Principles and Patterns》。在JDK
1.6的源碼中,還看到他修改的代碼(例如重寫Exchanger,修正N parters時(shí)死鎖的問題)。隨著JDK
1.5、1.6的普及推廣,他的思想,他的作品,都將產(chǎn)生極大的影響。
Douglas C. Schmidt

他創(chuàng)造了ACE,一個流行開源跨平臺的C++網(wǎng)絡(luò)框架。他的圖書著作:
《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等,他的書中也講述了基于事件/基于任務(wù)的模型,但這些并非他的創(chuàng)造。
Douglas C. Schmidt的成果是網(wǎng)絡(luò)、并發(fā)、跨平臺。
Douglas C. Schmidt創(chuàng)造輝煌的時(shí)刻已經(jīng)過去了。
Herb Sutter

ISO C++標(biāo)準(zhǔn)委員會主席,微軟C++/CLI首席架構(gòu)師,Exceptional三卷書的作者,目前領(lǐng)導(dǎo)微軟的concur
Project。從2005年開始,他一直發(fā)表一些預(yù)告并發(fā)時(shí)代來臨的文章。2005年,他代表Microsoft參加OOPSLA,主題就是關(guān)于C++
/CLI的并發(fā)。Herb Sutter是我極為敬仰的牛人!
他的網(wǎng)站:
http://www.gotw.ca/

文章來源:
http://www.cnblogs.com/jobs/archive/2006/11/10/556470.html
C++領(lǐng)域的知名人物
Bjarne Stoustrup 一代宗師,發(fā)明了C++,并且作了第一個實(shí)現(xiàn),把面向?qū)ο蠹夹g(shù)帶入主流,豐功偉業(yè)啊。
Herb Sutter 大師 (IOS/ANSI C++標(biāo)準(zhǔn)委員會秘書,目前領(lǐng)導(dǎo)微軟的Concur Porject,推動并發(fā)進(jìn)入主流,有成為宗師的潛力)
Andrei Alexandrescu 牛人 (經(jīng)典著作《Modern C++ Design Generic Programming and Design Patterns Applied》)
Lippman 牛人 (寶刀已老)
Scott Meyers (著名講師,自吹為C++領(lǐng)域權(quán)威,著作為Effetive C++系列)
侯捷 (著名譯者,翻譯的書質(zhì)量不錯,但他寫的書千萬別買)
上面的排名分先后.
Herb Sutter
我最佩服的人之一,他寫的Exceptional C++系列三卷書,他的網(wǎng)站www.gotw.ca,OOPSLA上的演講,他在微軟的C++/CLI、Concur Projec等,最近兩年所寫的關(guān)于并發(fā)的一些列文章,都是非常非常的棒,偶像?。?!


有胡子的照片比較帥一些。
Bjarne Stoustrup
他來過中國,以前的照片是有胡子的,好酷,最近他網(wǎng)站的照片胡子刮干凈了,難道是為了顯得年輕一些么?

Lippman
很明顯,他已經(jīng)老了。
Scott Meyers

這就那個說自己是C++領(lǐng)域權(quán)威的家伙(真的是嗎?)

文章來源:
http://www.cnblogs.com/jobs/archive/2006/11/11/557511.html
昨天就開始看這個PPT,看了幾遍,對并發(fā)的前景有了更多的理解。
http://irbseminars.intel-research.net/HerbSutter.pdf可以從他的網(wǎng)站上下載視頻版本。
過去30年,主流軟件開發(fā)一直忽略了并發(fā)。但是現(xiàn)在,并發(fā)時(shí)代要來了,因?yàn)槲覀兊男码娔X是并發(fā)的,軟件開發(fā)將會迎來巨變。
現(xiàn)在買的電腦,是雙核的,明年就會是4核,然后就是8核,16核,32核……,都是之后幾年的事情,一切都不遙遠(yuǎn)!

很多服務(wù)器程序準(zhǔn)備好了(也不完全是吧),而客戶端程序還沒有。

算法的時(shí)間復(fù)雜度改變了

盲人摸象

技術(shù)發(fā)展史
|
出現(xiàn) |
進(jìn)入主流 |
GUIs |
1973 (Xerox Alto) |
~1984-89 (Mac)
~1990-95 (Win3.x) |
Objects |
1967 (Simula) |
~1993-98 (C++, Java) |
Garbage Collection |
1958 (Lisp) |
~1995-2000 (Java) |
Generic Types |
1967 (Strachey) |
~198x (US DoD, Ada) ~1995-2000 (C++) |
Concurrency |
1964 (CDC 6600) |
~2007-12 (est.) |
他的PPT中還講述了Acitve Object、Future、Atomic之類的,VC提供特別語法支持。這也是老生常談的咚咚了。

文章來源:
http://www.cnblogs.com/jobs/archive/2006/11/12/558078.html
一般來說,Exchanger都是一個Consumer,一個producer,在適當(dāng)?shù)臅r(shí)候互相交換,這樣可以避免鎖。
我想到Exchanger N parties的一種用法。如下:
最初N個都是producer,達(dá)到一定條件之后,進(jìn)行交換。根據(jù)交換的結(jié)果重新確定角色,決定自己是consumer還是producer。
這樣做的結(jié)果是,最初所有都是producer,之后一部分轉(zhuǎn)變成consumer。并且由于consumer以及producer的速度不一樣,而能夠自動適應(yīng)調(diào)整。
要注意的是,JDK 1.5中的Exchanger只支持2 parties,N parties時(shí),N > 2會導(dǎo)致死鎖。JDK 1.6中,Exchanger重寫了,沒有這個問題。
在JDK 1.5中要這樣用的話,可以把JDK 1.6中Exchanger源碼抄過來就是了。

文章來源:
http://www.cnblogs.com/jobs/archive/2006/11/12/558626.html
java.util.concurrent中的ExecutorCompletionService,其實(shí)現(xiàn)的是CompletionService接口。
我對ExecutorCompletionService存在一個疑問,在其實(shí)現(xiàn)中,task是被執(zhí)行之后,才把futureTask加入到completionQueue,既然如此,不如直接把Result加入到completionQueue中了。這個行為沒什么差別的。對這個類的設(shè)計(jì)存在一些懷疑,我認(rèn)為其task方法,似乎返回值是V更合適。
原來是這樣的:
Future<V> take() throws InterruptedException;
Future<V> poll();
覺得也許應(yīng)該改稱這樣:
V take() throws InterruptedException;
V poll();

文章來源:
http://www.cnblogs.com/jobs/archive/2006/11/13/559609.html
客戶端程序應(yīng)用
無意發(fā)現(xiàn)的一個類
package javax.swing;


public abstract class SwingWorker<T, V> implements RunnableFuture<T>
{ }
也就是,一些并發(fā)相發(fā)的設(shè)計(jì)模式,已經(jīng)應(yīng)用在客戶端程序設(shè)計(jì)中。
我沒有對swing關(guān)注更多,只是覺得預(yù)想中的趨勢開始出現(xiàn)了。
Exchanger
重寫了,支持N parties。
RunnableFuture
這是理所當(dāng)然的事情,Executor使用之后,F(xiàn)utureTask這個東西常用,兼有Runnable和Future,所以出現(xiàn)一個RunnableFuture是理所當(dāng)然。
ConcurrentNavigableMap
一些系列的派生類,例如ConcurrentSkipListMap等等,還沒用過,大概就是一個并發(fā)支持的SortedMap了。

文章來源:
http://www.cnblogs.com/jobs/archive/2006/11/14/559859.html
應(yīng)該來說,util.concurrent包中提供的atomic,包括兩部分:
1、atomic值對象,例如AtomicInteger、AtomicLong等。常用作計(jì)數(shù)器。
2、AtomicReference
3、一些內(nèi)部使用Lock提供的compareAndSet操作。例如ConcurrentHashMap的putIfAbsent。
.NET中也提供了類似的功能,InterLocked類提供著完全的能力。
這是一種思想,提供原子操作,把兩個以上的操作合并,使得調(diào)用者不需要使用Lock,使得程序結(jié)構(gòu)變得簡單,減少出錯的可能,包括減少死鎖發(fā)生的可能,程序也因此獲得更好的性能。
將會有更多的數(shù)據(jù)結(jié)構(gòu)支持atomic操作,JDK 1.5提供了支持atomic操作的ConcurrentMap、JDK 1.6提供了支持atomic的ConcurrentNavigableMap。
如同Herb Sutter預(yù)測的那樣,并發(fā)技術(shù)將進(jìn)入主流,這個過程會持續(xù)數(shù)年。

文章來源:
http://www.cnblogs.com/jobs/archive/2006/11/14/560416.html
原來用不上,只是因?yàn)闆]學(xué)好,所以需要重新學(xué)習(xí)。

文章來源:
http://jobs.cnblogs.com/archive/2006/03/28/360548.html
1、還沒有找到快速返回整個BDB Database數(shù)據(jù)的辦法。類似關(guān)系數(shù)據(jù)庫中的SELECT * FROM T
2、還沒有找到使用索引進(jìn)行快速分組的辦法。類似關(guān)系數(shù)據(jù)庫中的SELECT F1, COUNT(*) FROM T GROUP BY F1 HAVING COUNT() > 1
以上的兩個問題,我都有了能夠正確返回結(jié)果的方案,但是還沒有快速返回結(jié)果的辦法。我估計(jì)還是需要認(rèn)真閱讀BDB源碼之后才能解決。
2006年4月4,我已經(jīng)找到原來測試返回整個DBD Database數(shù)據(jù)效率低的原因,是因?yàn)槭褂肧erialBinding的原因。全部改成TupleBinding,速度快了很多,速度是SQL Server的三倍。(返回56444行記錄)
最近也加入了My SQL的性能測試,事實(shí)上My SQL在查詢時(shí)的速度不如SQL Server。特別作Group by的時(shí)候,性能很差的。

文章來源:
http://jobs.cnblogs.com/archive/2006/03/30/362272.html