行并程編難很。呃,再試一下,并行編程很難。
盡管這個例子有些滑稽,但是我輸入的第一個句子確實(shí)能夠反映我們開發(fā)人員在編寫多線程代碼的時候需要面對的一些典型問題。當(dāng)我在寫這篇序言的時候,我的兩只正在筆記本電腦上打字的手實(shí)際上就是兩個完全分開的物理進(jìn)程。如果您更進(jìn)一步,將我的每一根手指都考慮為一個獨(dú)立的實(shí)體,那么就相當(dāng)于有10個完全獨(dú)立的進(jìn)程。我是一個公認(rèn)的打字快手,為了在每分鐘內(nèi)能輸入100個以上的單詞,我的大腦要設(shè)法協(xié)調(diào)我所有的手指,讓它們能夠并發(fā)地轉(zhuǎn)移到下一個目標(biāo),然而還要確保手指的輸出能夠根據(jù)我腦中想要輸入的內(nèi)容的拼寫方式進(jìn)行串行化。在輸入第一個句子時,我故意沒有使用上述協(xié)調(diào)機(jī)制,這樣我的手指就再也不能正確地同步了。這樣做的結(jié)果就是我的想法很難以可讀的方式表現(xiàn)出來。幸運(yùn)的是,這種錯誤很容易調(diào)試。
并行編程實(shí)在是很難,至少從歷史上來說一直是這樣。利用一些可用的工具,只有少部分軟件開發(fā)人員能夠熟練掌握成功開發(fā)和調(diào)試多線程應(yīng)用程序的技能??墒牵S著現(xiàn)代計(jì)算機(jī)的出現(xiàn),那些需要開發(fā)能夠響應(yīng)的用戶界面、構(gòu)建可擴(kuò)展服務(wù)以及為了獲得性能要利用多處理內(nèi)核的開發(fā)人員們被迫要處理并發(fā)問題,被迫要在線程、互斥量和信號量的層次上開發(fā)軟件。開發(fā)這些軟件的困難在于:申請超額(oversubscription)、競爭條件(race condition)、死鎖(deadlocks)、活鎖(live lock)、二步舞(two-step dance)、優(yōu)先級翻轉(zhuǎn)(priority inversion)、鎖封護(hù)(lock convoy)、偽共享(false sharing)等。
因?yàn)橛羞@些復(fù)雜性的存在,再加上最近業(yè)界向多核和眾核(manycore)轉(zhuǎn)移的趨勢,使得并行編程又受到了很多公司的重視,所以很多公司建立了開發(fā)平臺,而Microsoft是這些公司中的領(lǐng)軍者。好幾年前,Microsoft的Parallel Computing Platform團(tuán)隊(duì)就以清晰的愿景和目標(biāo)出現(xiàn)在了人們的面前:為了讓并行軟件的構(gòu)建更加簡單。應(yīng)該讓開發(fā)人員能夠非常簡單地表達(dá)存在于應(yīng)用程序中的并行性,并且要讓底層的框架、運(yùn)行時和操作系統(tǒng)來為開發(fā)人員實(shí)現(xiàn)并行化,能夠?qū)㈤_發(fā)人員表達(dá)出來的并行化映射到底層硬件,使其能夠正確且高效地執(zhí)行。Parallel Computing Platform團(tuán)隊(duì)的第一波并行支持組件是在2010年4月份作為Visual Studio 2010的一部分發(fā)布的。不論您使用的是原生代碼還是托管代碼,這一次發(fā)布的內(nèi)容都提供了簡化并行應(yīng)用程序開發(fā)的基礎(chǔ)組件。對于使用托管代碼的開發(fā)人員來說,這一次發(fā)布的內(nèi)容包括:Task Parallel Library、Parallel LINQ、新的Parallel Stacks調(diào)試窗口和Parallel Tasks調(diào)試窗口、能夠讓您深入查看多線程應(yīng)用程序執(zhí)行的Concurrency Visualizer,當(dāng)然還有更多的精彩內(nèi)容。
盡管有了這些工具的支持,并行編程仍然需要深入的知識。在這個以140個字符短語作為主要交流手段的年代里(特指微博),我個人認(rèn)為一本高質(zhì)量的書籍仍然是傳播那些深奧知識的最佳載體。幸運(yùn)的是,您現(xiàn)在就在閱讀這樣一本書。Gastón Hillar向大家呈現(xiàn)的是一本內(nèi)容全面的書籍,涵蓋了通過Visual Studio 2010和.NET Framework 4開發(fā)并行應(yīng)用程序所涉及的方方面面。從基于任務(wù)的編程,到數(shù)據(jù)并行化、共享狀態(tài)的管理以及并行程序的調(diào)試;從Task Parallel Library到Parallel LINQ、ThreadPool以及新的協(xié)調(diào)數(shù)據(jù)結(jié)構(gòu)和同步原語。Gastón以深入淺出的方式為大家講解了.NET Framework 4和Visual Studio 2010中對并行編程的廣泛支持。
本書包含的內(nèi)容可以幫助您獲得開發(fā)并行應(yīng)用程序所需的堅(jiān)實(shí)基礎(chǔ)知識。恭喜您已經(jīng)已經(jīng)跨入多核新世界的第一步了。
——Stephen Toub
微軟并行編程平臺首席項(xiàng)目經(jīng)理
2010年9月