版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、<p><b> 南京郵電大學(xué)</b></p><p> 畢業(yè)設(shè)計(論文)外文資料翻譯</p><p> 附件:1.外文資料翻譯譯文;2.外文原文</p><p> 附件1:外文資料翻譯譯文</p><p><b> 現(xiàn)代并發(fā)抽象C#</b></p><p&g
2、t; 尼克·本頓,盧卡·卡戴爾和塞德里克?富爾</p><p><b> 微軟研究院</b></p><p><b> 1.1語言和并發(fā)</b></p><p> 并發(fā)是現(xiàn)代代碼中的一個重要實(shí)現(xiàn)形式:并發(fā)程序的編寫設(shè)計,解釋,調(diào)試,和調(diào)整都是有難度的。并發(fā)可以顯著影響一個結(jié)構(gòu)中的語言的含義(開始
3、轉(zhuǎn)讓的原子),并能影響調(diào)用庫的能力。盡管這樣,最流行的編程語言對待并發(fā)語言不是作為一種語言功能的并發(fā)性,而往往是作為一個收集的,根據(jù)指定的外部庫??紤]到這樣的事實(shí)后,規(guī)范的并發(fā)庫[比勒爾等。 1987年;斯林等。 1996年Detlefs等。 1998年古列維奇等。 2000] 已給予相當(dāng)?shù)闹匾?,通常通過這些規(guī)范就可以對他們的行為應(yīng)該在何處執(zhí)行做出判斷。然而,即使當(dāng)并發(fā)庫被正確指定,但由于他們是庫,而不是語言的特點(diǎn)這個事實(shí),還是會有不良
4、的后果。</p><p> 在原則上,可以提供許多功能,,無論是作為語言特性或作為庫:典型的例子是,內(nèi)存管理和異常。有“語言”等功能的優(yōu)點(diǎn)是,編輯者可以對它們進(jìn)行分析,因此可以產(chǎn)生更好的代碼,并警告親程序員的潛在和實(shí)際問題。特別是,編譯器可以檢查語法嵌入的變量,這將是很難從庫中提取調(diào)用的集合。此外,程序員可以更可靠說明自己的意圖,通過一個清晰的語法和其他工具比編輯者可以更容易地確定程序員的意圖。特定領(lǐng)域的語言[
5、Ramming 1997; Kamin 1997]是一個極端的語言學(xué)方法的例子:經(jīng)常提出新的特設(shè)語言并不是要取代通用的語言,而是為了方便特定于域的代碼分析域相關(guān)的功能,作為原始的語言表達(dá)簡單的事實(shí)結(jié)構(gòu)。</p><p> 我們相信,并發(fā)應(yīng)該是一個語言功能的一部分和一種語言規(guī)范。在70年代開始在這個方向作了很多嘗試,顯示器[霍爾1974年]的概念和奧卡姆語言[INMOS有限公司1984](基于通信順序進(jìn)程[霍爾1
6、985])。監(jiān)控器的一般概念已經(jīng)變得非常流行,特別是在其目前的面向?qū)ο蟮男问骄€程和對象綁定互斥,但它已提供作為一個語法的外殼模板,最可選鎖定對象上的方法調(diào)用。</p><p> 許多事情因?yàn)楸O(jiān)控器被引入并發(fā)而已經(jīng)改變。通信已變得更加的異步,并行計算一定要通過規(guī)模較大的“精心策劃”的。值得關(guān)注的是沒有那么多的有效的實(shí)施和使用鎖在一個單一的處理器或者多重處理器,但沒有不必要的異步事件的處理能力阻止長期客戶,并沒有死
7、鎖。換句話說,重心正在從共享內(nèi)存并發(fā)轉(zhuǎn)向消息或事件并發(fā)性。</p><p> 這些新的要求應(yīng)該得到可以處理異步通信和不束縛共享記憶的編程結(jié)構(gòu)的方法。盡管出現(xiàn)大規(guī)模的模式設(shè)計如[America 1989; Agha et al.1993; Reppy 1992; Pierce and Turner 2000; Philippsen 1995],但只有監(jiān)控器獲得廣泛接受的編程結(jié)構(gòu)。</p><p
8、> 最近在富爾和Gonthier的[1996,2002]加入演算中顯現(xiàn)了一個有趣的新的語言方法,進(jìn)程演算非常適合在分布式的環(huán)境中直接執(zhí)行。其他語言,如JoCaml [Conchon and Le Fessant 1999]和 Funnel [Odersky 2000],結(jié)合了類似功能編程模型的想法。在這里,我們提出了一個加入演算想法的適應(yīng)一個面向?qū)ο蟮恼Z言,有一個現(xiàn)有線程和鎖的并發(fā)模型。 itzstein和Kearney [20
9、01]最近為Java描述非常類似的擴(kuò)展。</p><p><b> 1.2異步編程</b></p><p> 異步的事件和消息傳遞越來越多地用于在各級軟件系統(tǒng)。在最低水平,設(shè)備驅(qū)動程序必須對異步設(shè)備事件迅速作出反應(yīng),而資源利用上的吝嗇。在圖形用戶界面級別是出了名的,復(fù)雜的代碼和編程模型,因?yàn)橛脩羰录漠惒叫再|(zhì);在同一時間,用戶討厭被不必要的封鎖。在廣域網(wǎng)的水平,例
10、如,在協(xié)作應(yīng)用,分布式的工作流,Web服務(wù),我們現(xiàn)在遇到類似的問題,因?yàn)槿蛲ㄐ诺漠惒叫再|(zhì)和潛伏期和復(fù)雜性。</p><p> 在所有這些領(lǐng)域,我們自然會發(fā)現(xiàn)有很多要處理的同時異步消息的情況下,多線程用來處理它們。主題仍然是一個在大多數(shù)系統(tǒng)中昂貴的資源。然而,如果我們能有些隱藏在背后的消息和線程使用一種語言機(jī)制,那么很多的選項成為可能。編譯器可狀態(tài)機(jī)轉(zhuǎn)換成并發(fā)的一些模式,優(yōu)化使用隊列,使用輕量級的線程,在可能的
11、情況下,避免分叉線程沒有必要的,并使用線程池。這一切都是真的有可能只有一個擁有上譜“,可以發(fā)生的事情”:這個手柄可以處理由并發(fā)操作,既可以隱藏,從而使多個語法實(shí)現(xiàn)技術(shù)。因此,我們的目標(biāo)是促進(jìn)異步編程抽象是高層次的,從一個程序員的角度來看,使低層次的優(yōu)化,從一個編譯器和運(yùn)行時系統(tǒng)的角度來看。我們提出用現(xiàn)代并發(fā)C#語言的延伸異步編程抽象。在與音樂的精神調(diào)諧的C#和并發(fā)活動的“協(xié)調(diào)流程”,我們稱這種語言復(fù)調(diào)C#。</p><
12、;p> 1.3 C# 和 .NET</p><p> C#是一個現(xiàn)代,類型安全,面向?qū)ο缶幊陶Z言,最近微軟推出的Visual Studio.NET2001][ECMA的一部分。 C#程序上運(yùn)行.NET框架,其中包括多語言的執(zhí)行頂部</p><p> 引擎和一個豐富的類庫集合。.NET執(zhí)行引擎提供了一個多線程的執(zhí)行環(huán)境潛在的相互關(guān)聯(lián)與同步鎖MENT在堆上分配的對象。C#語言,包括
13、一個lock語句,執(zhí)行的過程中獲得一個給定的對象相關(guān)聯(lián)的互斥阻塞。此外,.NET庫實(shí)現(xiàn)了許多傳統(tǒng)的并發(fā)控制原語,如信號量,互斥和讀/寫鎖,以及異步編程模型的基礎(chǔ)上代表。.NET框架還提供更高級別的基礎(chǔ)設(shè)施建設(shè)分布應(yīng)用和服務(wù),如基于SOAP的消息傳遞和遠(yuǎn)程方法打電話。</p><p> .NET Framework中的并發(fā)和分配機(jī)制功能強(qiáng)大,但他們也不可否認(rèn)復(fù)雜。且不說從原語,更多的或較少的基礎(chǔ)設(shè)施,在烤“讓人眼
14、花繚亂,有一臺機(jī)器上(共享內(nèi)存,線程,同步的基礎(chǔ)上的東西是20世紀(jì)70年代的并發(fā)模型之間的不匹配相互排斥)和異步,基于消息的風(fēng)格,使用編程基于網(wǎng)絡(luò)的應(yīng)用和服務(wù)。因此,C#中似乎是一個為主流的并發(fā)語言支持我們的想法,理想的測試床語言。</p><p> 2。復(fù)調(diào)C#語言概述</p><p> 本節(jié)介紹新構(gòu)造復(fù)調(diào)的C#語法和語義,然后給出了更精確,雖然仍是非正式的,規(guī)范</p>
15、<p><b> 語法。</b></p><p><b> 2.1基本思路</b></p><p> 到C#的相當(dāng)傳統(tǒng)的面向?qū)ο缶幊棠P?,?fù)調(diào)C#增加了兩個新概念:異步方法和復(fù)調(diào)。</p><p> 異步方法。傳統(tǒng)的方法是同步的,在檢測到來電者沒有取得任何進(jìn)展,直到被叫方完成。復(fù)調(diào)C#中,如果一個方法
16、被聲明為異步調(diào)用任何保證立即基本上完成。異步方法永遠(yuǎn)不會返回結(jié)果(或拋出異常);他們使用async關(guān)鍵字,而不是宣布無效。調(diào)用異步方法很像是發(fā)送消息,或張貼的事件。由于異步方法立即返回,方法的調(diào)用如下:</p><p> async postEvent(EventInfo data) {</p><p> // large method body</p><p>
17、;<b> }</b></p><p> 是唯一可以合理地調(diào)用立即返回,“大被安排在不同的線程執(zhí)行方法體“(無論是一個新的催生了以服務(wù)這個呼叫,或者從一些游泳池的工人)。然而,這樣的定義,實(shí)際上是相當(dāng)難得的C#復(fù)調(diào)。更常見的異步方法是使用如下所述的復(fù)調(diào),定義,不一定需要新的線程。復(fù)調(diào)。復(fù)調(diào)(也被稱為“同步模式”,或“加盟模式”)由一個頭和一個身體。頭是一套方法聲明由“&”分隔。身體只執(zhí)行
18、一次所有的方法,在頭被稱為方法調(diào)用隱含排隊等候,直到/除非是有現(xiàn)代并發(fā)抽象為C#匹配的復(fù)調(diào)??紤],例如:</p><p> public class Buffer {</p><p> public string Get() & public async Put(string s) {</p><p><b> return s;</b
19、></p><p><b> }</b></p><p><b> }</b></p><p> 上面的代碼定義了兩個實(shí)例方法的類的緩沖區(qū),這是共同定義在一個單一的復(fù)調(diào)。string Get()方法是一個同步的方法不接受參數(shù)并返回一個字符串。async Put(string s)方法是異步的(沒有返回結(jié)果),并
20、接受一個字符串參數(shù)。如果buff是緩沖和一個調(diào)用同步方法的]的一個buff . Get()實(shí)例。然后有兩種可能性:</p><p> 如果有以前的未匹配過的的通話buff . Put(s) (for some string s),那么現(xiàn)在有一個比賽,所以離隊待沽Put(s)和復(fù)調(diào)的身體運(yùn)行,返回到呼叫者的buff . Get()方法。</p><p> 如果是以前匹配過的來電buff
21、. Put(.),然后調(diào)用BUFF. get()方法阻塞,直到另一個線程提供了一個匹配的put()。</p><p> 相反,在調(diào)用異步方法的buff . Put(.),來電從未等待,但對于其他線程可能有兩種行為:</p><p> 如果有以前的未匹配過的通話buff . Get()再有就是現(xiàn)在的一次匹配,所以掛起調(diào)用出列和其相關(guān)阻塞的線程是喚醒運(yùn)行的復(fù)調(diào),返回值給s。</p&g
22、t;<p> 如果沒有掛起調(diào)用的buff.get(),然后調(diào)用到buff . Put(s)僅僅是排隊,直到一個個到達(dá)。</p><p> 到底哪的電話匹配是不確定的,所以即使是單線程程序如:</p><p> Buffer buff = new Buffer();</p><p> buff . Put(“blue”);</p>
23、<p> buff . Put(“sky”);</p><p> Console.Write(buff . Get() + buff . Get());</p><p> 也是不確定的(印刷或者“藍(lán)天”或“天藍(lán)”)。</p><p> 請注意,執(zhí)行緩沖不涉及產(chǎn)生任何主題:復(fù)調(diào)本身在運(yùn)行時,它在一個已經(jīng)存在的線程(即一個名為Get())。讀者在這一點(diǎn)
24、上可能會想什么規(guī)則決定在哪個線程體運(yùn)行,或如何,我們知道,方法調(diào)用將返回人體所計算的最終價值。答案是,在任何給定的弦,最多的一種方法可能是同步的。如果有這種方法,然后身體在與調(diào)用線程運(yùn)行這一號召的方法,并返回值。只是,如果沒有這樣的方法(即在弦的所有方法都是異步)運(yùn)行在一個新的線程,在這種情況下,有沒有要返回的值。還應(yīng)當(dāng)指出,緩沖區(qū)的代碼,瑣碎,但它是,是線程安全的。需要鎖定(例如,以防止參數(shù)返回兩個不同的獲取到一個單放)自動生成由編譯
25、器。更確切地說,決定是否任何復(fù)調(diào)呼叫啟用,如果是這樣,從隊列中刪除其他懸而未決的呼叫和調(diào)度為執(zhí)行機(jī)構(gòu),是一個原子操作。除了這個原子性的保證,然而,有沒有監(jiān)視器像復(fù)調(diào)機(jī)構(gòu)之間的相互排斥的。任何相互排斥的需要,必須明確在編程在弦頭的同步條件。緩沖區(qū)的例子定義了兩個方法使用一個單一的復(fù)調(diào)。這也是(普通)有涉及給定方法的多復(fù)調(diào)。例如:</p><p> public class Buffer {</p>
26、<p> public string Get() & public async Put(string s) {</p><p><b> return s;</b></p><p><b> }</b></p><p> public string Get() & public async
27、 Put(int n) {</p><p> return n.ToString();</p><p><b> }</b></p><p><b> }</b></p><p> 現(xiàn)在我們已經(jīng)定義為數(shù)據(jù)緩沖區(qū)的方法之一,但有兩個把它的方法(其中發(fā)生類型,而不是要區(qū)分比名)。Get()調(diào)用可
28、以同步調(diào)用的put()方法。如果有排隊調(diào)用Put()s,那么哪一個同步隨后Get()是不確定的。</p><p><b> 3。非正式規(guī)范</b></p><p><b> 3.1語法</b></p><p> 到C語法的語法擴(kuò)展[ECMA 2001, Appendix C]是非常次要的。我們添加一個新的關(guān)鍵字asy
29、nc,并添加它作為一種替代的返回類型:</p><p> returntype : := type | void | async這使得方法,代表和接口方法被宣布異步的。在類成員的聲明中,我們更換方法聲明</p><p> chorddeclaration : :=</p><p> methodheader [& methodheader]? bo
30、dy</p><p> methodheader : :=</p><p> 屬性修飾符返回類型成員名(形參)。</p><p> 我們呼吁復(fù)調(diào)聲明微不足道的,如果它宣布一個單一的,同步的方法(即它是一個標(biāo)準(zhǔn)的C方法聲明)。</p><p><b> 3.2良好的格式</b></p><p&g
31、t; 擴(kuò)展類是格式良好的條件:</p><p> 在一個單一的方法頭:</p><p> ?。?)如果返回類型是異步的,那么正式的參數(shù)列表中的形參不得</p><p> 包含任何ref或out參數(shù)修飾符。</p><p> 在一個單一的復(fù)調(diào)聲明:</p><p> ?。?)最多的一種方法頭可能有非異步的返回類型
32、。</p><p> ?。?)如果弦有一個返回類型的類型的方法頭,然后身體可能使用返回類型的表達(dá)式的語句,否則身體可能使用空的return語句。</p><p> ?。?)在方法頭中出現(xiàn)的所有形參必須有鮮明的標(biāo)識。</p><p> ?。?)兩種方法,頭可能沒有相同的成員名稱和相同的參數(shù)類型簽名。</p><p> (6)的方法,頭必須全部
33、申報的實(shí)例方法或所有聲明的靜態(tài)方法。</p><p><b> 在一個特定的類:</b></p><p> (7)具有相同的成員名稱和參數(shù)類型的所有方法頭簽名必須具有相同的屬性的返回類型和相同的套和修飾符。</p><p> (8)如果它是一個值類(結(jié)構(gòu)),那么只有靜態(tài)方法可能會出現(xiàn)在不平凡的復(fù)調(diào)。</p><p>
34、; ?。?)如果任何復(fù)調(diào)聲明包括一個覆蓋虛擬方法M修飾符,那么任何方法n出現(xiàn)在包含重寫定義的m的超弦與M也必須被重寫在子類中。</p><p> 這些條件大多是相當(dāng)簡單的,但條件2和9值得我們進(jìn)一步的評論。</p><p> 條件9提供了一個保守的,但簡單,完整性檢查時,煉油類包含復(fù)調(diào)以來,在一般情況下,實(shí)現(xiàn)繼承和并發(fā)不拌勻[松岡和米澤1993](見富爾等。 [2000]連接的情況下討
35、論了“繼承異常”微積分)。這里是我們的方法來執(zhí)行這兩個關(guān)注點(diǎn)分離:一系列的復(fù)調(diào),必須是當(dāng)?shù)氐囊活惢蜃宇惵暶鞯恼Z法;方法重寫時,他們所有的復(fù)調(diào)還必須完全重寫。如果認(rèn)為執(zhí)行一個給定的方法包括所有同步和機(jī)構(gòu),它出現(xiàn)的所有的復(fù)調(diào),那么,我們繼承的限制似乎不是沒有道理的,因?yàn)樵冢ǚ欠ǎ┐a,如</p><p><b> class C {</b></p><p> virt
36、ual void f () & virtual async g () { /? body1 ?/ }</p><p> virtual void f () & virtual async h() { /? body2 ?/ }</p><p><b> }</b></p><p><b> }</b>
37、</p><p> class D : C {</p><p> override async g () { /? body3 ?/ }</p><p> 一個會覆蓋G(),也有“一半”重寫F()。</p><p> 更務(wù)實(shí)的態(tài)度,消除對繼承的限制,使得這一切太容易引入無意僵局(或“異步泄漏”)。如果上面的代碼是合法的,那么代碼編寫的
38、期望,使匹配的C類的實(shí)例F()和g()的調(diào)用將無法工作時,通過D 所有的實(shí)例g()的調(diào)用會導(dǎo)致body3運(yùn)行,所有的調(diào)用f()的僵局。請注意,在繼承的限制手段,如聲明</p><p> virtual void f () & private async g () { /? body1 ?/ }</p><p> 是不正確的聲明只是一個F()和g()是虛擬的,是沒有意義的(是作
39、為我們的編譯器的錯誤標(biāo)記),作為壓倒一切的要求其他要重寫了。這也是值得觀察,有一個傳遞閉包操作隱含在我們繼承的限制:如果f()是重寫,并加入與g(),然后因?yàn)間()必須被覆蓋,所以必須任何方法H()加入與g()等。</p><p> 制定重寫規(guī)則更加復(fù)雜和寬容是有可能的。我們的目前的規(guī)則有簡單的優(yōu)勢,但我們指的讀者富爾等。 [2000]為更深入的研究在繼承和并發(fā)加入演算。在該文件中,類(部分)同步的集合可以使用
40、一些繼承運(yùn)營商結(jié)合和轉(zhuǎn)化的模式。像往常一樣,然后創(chuàng)建對象可以實(shí)例化類,同步模式是不可擴(kuò)展的。類的組成控制一個復(fù)雜的的打字紀(jì)律,防止“消息不理解為“在運(yùn)行時的錯誤。格式良好上述條件2也是合理的,由現(xiàn)有的C#功能和純加入演算之間的潛在的不良相互作用。允許多個同步調(diào)用出現(xiàn)在一個單一的復(fù)調(diào)會給一種潛在的有用的交會設(shè)施(提供一個也加入語法允許特定的調(diào)用返回結(jié)果)。例如,以下的實(shí)例類:</p><p> class Ren
41、dezVous {</p><p> public int f (int i) & public int g (int j ) {</p><p> return j to f ;</p><p> return i to g ;</p><p><b> }</b></p><p&g
42、t;<b> }</b></p><p> 將匹配的雙F和G的調(diào)用,然后交換它們的值并繼續(xù)。然而,也必須決定在封鎖線程機(jī)構(gòu)應(yīng)運(yùn)行,這樣的選擇一般觀察。如果這只因?yàn)榫€程的身份可以得到平等檢查,這個問題將是相當(dāng)學(xué)術(shù)。但是,在C#,選擇線程做一個方案由于到折返鎖,基于堆棧的安全性和線程局部變量,從而使行為的顯著性差異“非常”非交換。</p><p> 當(dāng)然,這也不是很
43、難明確方案復(fù)調(diào)C#上述交會:</p><p> class RendezVous {</p><p> class Thunk {</p><p> int wait() & async reply(int j ) {return j ;}</p><p><b> }</b></p>&l
44、t;p> public int f (int i) {</p><p> Thunk t = new Thunk();</p><p> af (i, t);</p><p> return t.wait();</p><p><b> }</b></p><p> privat
45、e async af (int i, Thunk t) & public int g (int j ) {</p><p> t . reply( j ); // returning to f</p><p> return i; // returning to g</p><p><b> }</b></p>&l
46、t;p><b> }</b></p><p> 對于每個調(diào)用到f,我們創(chuàng)建了一個輔助類咚的實(shí)例,為了等待異步答復(fù)消息,這是同步后發(fā)送一些?。</p><p><b> 3.3打字問題</b></p><p> 我們把a(bǔ)sync作為一個無效的亞型,并允許異步協(xié)變返回類型,只是在這兩個類型(偽)的情況下。從而&l
47、t;/p><p> 一個異步方法可以覆蓋一個void類型,</p><p> 委托void類型,可以創(chuàng)建一個異步方法,</p><p> 一個異步方法可以實(shí)現(xiàn)一個接口void方法</p><p> 而不是相反。這種設(shè)計使得直觀的感覺(異步方法無效,但有額外的屬性返回“立即”),并最大限度地使用現(xiàn)有的C#代碼(父類,接口和兼容性委托的定義)
48、的無效使用。</p><p><b> 4。復(fù)調(diào)c#的編程</b></p><p> 在介紹語言,我們現(xiàn)在怎么可能被用來解決并發(fā)編程問題的范圍。</p><p> 4.1一個簡單的細(xì)胞類</p><p> 我們先從一個簡單的地方細(xì)胞類的實(shí)現(xiàn)。單元格有兩種公共同步方法:void Put(object o) 和 ob
49、ject Get()。把呼叫塊,直到單元格是空的,然后用它的參數(shù)填充單元。一個調(diào)用獲取塊,直到單元格是滿的,然后刪除,并返回其內(nèi)容:</p><p> public class OneCell {</p><p> public OneCell() {</p><p><b> empty();</b></p><p&
50、gt;<b> }</b></p><p> public void Put(object o) & private async empty() {</p><p> contains(o);</p><p><b> }</b></p><p> public object Ge
51、t() & private async contains(object o) {</p><p><b> empty();</b></p><p><b> return o;</b></p><p><b> } </b></p><p><b>
52、 }</b></p><p> 在另外兩個公共方法,類使用兩個私人異步方法,empty()和contains(object o),進(jìn)行單元格的狀態(tài)。有一個簡單的聲明構(gòu)造和解釋兩個和弦這是如何工作:</p><p> 構(gòu)造。當(dāng)一個細(xì)胞被創(chuàng)建,它是最初是空的()。</p><p> 輸出和弦。如果我們把一個單元格是一個空的()對象,然后單元格隨后包含(
53、O)。</p><p> 獲取和弦。如果我們獲得()單元格的內(nèi)容,然后包含一個空的對象,返回值是o。</p><p> 含蓄。在所有其他情況下,提出并獲取等待。</p><p> 使用私人異步方法(而不是域)的技術(shù)攜帶狀態(tài)是很常見的和弦的C#。觀察到的構(gòu)造</p><p> 建立,每在類OneCell身體保留,簡單,易于驗(yàn)證不變:&l
54、t;/p><p> 總是有一個掛起的異步方法調(diào)用:無論是empty(),或contains(o)。</p><p> ?。ㄏ喾纯赡苡腥我鈹?shù)量的客戶端線程阻塞與掛起的調(diào)用,把獲取,甚至同時運(yùn)行的語句返回0到之前的變量體。),因此也可以作為直接讀取類定義一個自動的規(guī)范:</p><p><b> 4.2讀寫鎖</b></p><
55、p> 作為一個異步方法的使用進(jìn)行狀態(tài)更現(xiàn)實(shí)的例子和同步訪問該狀態(tài)的和弦,我們現(xiàn)在考慮的經(jīng)典問題多的讀者,作家單鎖保護(hù)共享的易變的資源。每個客戶的要求,然后釋放,要么共享訪問或獨(dú)占訪問,使用相應(yīng)的共享的公共方法,釋放共享,獨(dú)家,釋放獨(dú)占。沒有其他共享訪問塊的請求,直到客戶端具有獨(dú)占訪問,同時請求,直到?jīng)]有獨(dú)占訪問塊其他客戶端有任何訪問。一個典型的解決這個問題,使用傳統(tǒng)的并發(fā)原語在Modula3給出由,比勒爾[1989];和弦
56、99;#,它可以只有五和弦:</p><p> class ReaderWriter</p><p><b> {</b></p><p><b> }</b></p><p> ReaderWriter() {idle();}</p><p> public vo
57、id Shared() & async idle() {s(1); }</p><p> public void Shared() & async s(int n) {s(n + 1); }</p><p> public void ReleaseShared() & async s(int n) {</p><p> if (n ==
58、 1) idle(); else s(n ? 1);</p><p><b> }</b></p><p> public void Exclusive() & async idle() {}</p><p> public void ReleaseExclusive() { idle(); }</p><p&
59、gt; 每一個版本如下規(guī)定相應(yīng)的要求,不變是鎖狀態(tài)(沒有消息,一條消息空閑(),或單線程的種類和數(shù)量相匹配,目前消息小號N> 0(N))持有該鎖(獨(dú)家線程,沒有線程,或n共享的線程)。萬一有一個消息,等候在一個給定的私有方法,它是一個選擇的問題,是否使用私有字段的對象或參數(shù)在私人訊息。在上面的例子中,n是有關(guān)的,只有當(dāng)有消息中的()。盡管如此,相反,我們可以編寫以下等效的代碼:</p><p> cla
60、ss ReaderWriterPrivate</p><p><b> {</b></p><p><b> }</b></p><p> ReaderWriter() { idle(); }</p><p> private int n = 0; // protected by s()&l
61、t;/p><p> public void Shared() & async idle() { n = 1; s(); }</p><p> public void Shared() & async s() { n++; s(); }</p><p> public void ReleaseShared() & async s() {<
62、;/p><p> if (??n == 0) idle(); else s();</p><p><b> }</b></p><p> public void Exclusive() & async idle() {}</p><p> public void ReleaseExclusive() { id
63、le(); }</p><p> 僅我們的執(zhí)行和底層操作系統(tǒng)調(diào)度提供基本的公平屬性例如:如果有足夠的等候和弦對象的調(diào)用匹配一個和弦,那么至少有一個和弦最終會運(yùn)行。因此,它是非常有用的一些明確具體公平或優(yōu)先的額外的應(yīng)用程序編程。例如,上面的代碼,編寫者未必能夠獲得新的讀者只要獨(dú)占鎖獲得一個共享鎖。我們進(jìn)一步完善這個代碼來實(shí)現(xiàn)一個特定的公平當(dāng)有掛起的編寫者,至少讀者和編寫者之間:一位編寫者,將獲得目前所有的讀者釋放
64、它的鎖。為此,我們增加額外的共享狀態(tài):T(),我們不接受新的讀者,idleExclusive(),在我們所提供的獨(dú)占鎖以前選擇主題:</p><p> class ReaderWriterFair</p><p><b> {</b></p><p><b> }</b></p><p>
65、. . . // same content as in ReaderWriterPrivate, plus:</p><p> public void ReleaseShared() & async t() {</p><p> if (??n == 0) idleExclusive(); else t();</p><p><b> }&l
66、t;/b></p><p> public void Exclusive() & async s() { t(); wait(); }</p><p> void wait() & async idleExclusive() {}</p><p><b> 4.3合并異步消息</b></p><p
67、> 消息傳遞通常會由服務(wù)器的外部接口,使用異步方法,每個參數(shù)都需要參數(shù)的請求和發(fā)送請求已經(jīng)服務(wù)的最終結(jié)果或通知的地方。例如,回調(diào)使用一個字符串參數(shù),服務(wù)代表,并返回一個整數(shù),看起來類似于:</p><p> public delegate async IntCallback(int result);</p><p> public class Service {</p&g
68、t;<p> public async Request(string arg, IntCallback cb) {</p><p><b> int r ;</b></p><p> . . . // do some work</p><p> cb(r); // send the result back</p>
69、;<p><b> } </b></p><p><b> }</b></p><p> 一種常見的客戶端模式,然后涉及到幾個并發(fā)的異步請求后阻塞直到所有已完成。這可以編程如下:</p><p> class Join2 {</p><p> public IntCallba
70、ck ?rstcb;</p><p> public IntCallback secondcb;</p><p> public Join2() {</p><p> ?rstcb = new IntCallback(?rst);</p><p> secondcb = new IntCallback(second);</p&g
71、t;<p><b> }</b></p><p> public void wait(out int i, out int j )</p><p> & async ?rst(int fst)</p><p> & async second(int snd) {</p><p>
72、i = fst; j = snd;</p><p><b> }</b></p><p><b> }</b></p><p> class Client {</p><p> public static void Main(string[] args) {</p><p
73、> Service s1 = . . . ;</p><p> Service s2 = . . . ;</p><p> Join2 x = new Join2();</p><p> s1.Request(args[0], x . ?rstcb);</p><p> s2.Request(args[1], x . seco
74、ndcb);</p><p><b> ...</b></p><p> int i, j ;</p><p> x.wait(out i, out j ); }</p><p><b> }</b></p><p><b> ...</b>&
75、lt;/p><p> 在到x.wait通話(I,J)將阻止,直到/除非服務(wù)已回答x上調(diào)用各自的回調(diào)。一旦發(fā)生這種情況,兩結(jié)果將被分配到i和j,客戶端將繼續(xù)進(jìn)行。概括注冊(當(dāng)然,自然屬于通用庫)任意同時通話,或定義類的條件,如等待至少35通話已完成很簡單的。</p><p><b> 附件2:外文原文</b></p><p> Modern C
76、oncurrency Abstractions for C#</p><p> NICK BENTON, LUCA CARDELLI, and CEDRIC FOURNET</p><p> Microsoft Research</p><p> 1. INTRODUCTION</p><p> 1.1Languages and C
77、oncurrency</p><p> Concurrency is an important factor in the behaviour and performance of modern code: concurrent programs are dif?cult to design, write, reason about, debug, and tune. Concurrency can signi
78、?cantly affect the meaning of virtually every other construct in the language (beginning with the atomicity of assignment), and can affect the ability to invoke libraries. Despite this, most popular pro gramming language
79、s treat concurrency not as a language feature, but as a collection of external libraries that</p><p> 1.2Asynchronous Programming</p><p> Asynchronous events and message passing are increasin
80、gly used at all levels of software systems. At the lowest level, device drivers have to respond promptly to asynchronous device events, while being parsimonious on resource use. At the Graphical User Interface level, cod
81、e and programming models are notoriously complex because of the asynchronous nature of user events; at the same time, users hate being blocked unnecessarily. At the wide area network level, for example in collaborative a
82、pplicat</p><p> 1.3C# and .NET </p><p> C# is a modern, type safe, object oriented programming language recently introduced by Microsoft as part of Visual Studio.NET [ECMA 2001]. C# programs
83、run on top of the .NET Framework, which includes a multilanguage execution engine and a rich collection of class libraries. The .NET execution engine provides a multithreaded execution environment with synchronization ba
84、sed on locks potentially associated with each heapal located object. The C# language includes a lock statement, which obtains the</p><p> Framework also provides higher level infrastructure for building dis
85、tributed applications and services, such as SOAP based messaging and remote method call. The concurrency and distribution mechanisms of the .NET Framework are powerful, but they are also undeniably complex. Quite apart f
86、rom the bewildering array of primitives that are more or less ‘baked in’ to the infrastructure, there is something of a mismatch between the 1970s model of concurrency on a single machine (shared memory, threads,</p&g
87、t;<p> 2. POLYPHONIC C# LANGUAGE OVERVIEW </p><p> This section describes the syntax and semantics of the new constructs in Poly phonic C# and then gives a more precise, though still informal, speci
88、?cation of the syntax. </p><p> 2.1 The Basic Idea </p><p> To C# ’s fairly conventional object oriented programming model, Polyphonic C# adds just two new concepts: asynchronous methods and c
89、hords. Asynchronous Methods. Conventional methods are synchronous, in the sense that the caller makes no progress until the callee completes. In Polyphonic C# , if a method is declared asynchronous then any call to it i
90、s guaranteed to complete essentially immediately. Asynchronous methods never return a result (or throw an exception); they are declared by using the</p><p> async postEvent(EventInfo data) {</p><
91、p> // large method body </p><p><b> } </b></p><p> is the only thing it could reasonably be: the call returns immediately and ‘large method body’ is scheduled for execution in
92、a different thread (either a new one spawned to service this call, or a worker from some pool). However, this kind of de?nition is actually rather rare in Polyphonic C# . More commonly, asynchronous methods are de?ned us
93、ing chords, as described below, and do not necessarily require new threads. Chords. A chord (also called a ‘synchronization pattern’, or ‘join pattern’) c</p><p> public class Buffer { </p><p>
94、; public string Get() & public async Put(string s) { </p><p> return s; </p><p><b> }</b></p><p><b> }</b></p><p> The code above de?ne
95、s a class Buffer with two instance methods, which are jointly de?ned in a single chord. Method string Get() is a synchronous method taking no arguments and returning a string. Method async Put(string s) is asynchronous (
96、so returns no result) and takes a string argument. If buff is a instance of Buffer and one calls the synchronous method buff . Get() then there are two possibilities: — If there has previously been an unmatched call to b
97、uff . Put(s) (for some string s) then th</p><p> Conversely, on a call to the asynchronous method buff . Put(s), the caller never waits, but there are two possible behaviours with regard to other threads: —
98、 If there has previously been an unmatched call to buff . Get() then there is now a match, so the pending call is dequeued and its associated blocked thread is awakened to run the body of the chord, which returns s. — If
99、 there are no pending calls to buff . Get() then the call to buff . Put(s) is simply queued up until one arrives.</p><p> Exactly which pairs of calls are matched up is unspeci?ed, so even a single threaded
100、 program such as </p><p> Buffer buff = new Buffer();</p><p> buff . Put(“blue”); </p><p> buff . Put(“sky”);</p><p> Console.Write(buff . Get() + buff . Get());<
101、;/p><p> is nondeterministic (printing either “bluesky” or “skyblue”).3 </p><p> Note that the implementation of Buffer does not involve spawning any threads: whenever the body of the chord runs,
102、 it does so in a preexisting thread (viz. the one that called Get()). The reader may at this point wonder what the rules are for deciding in which thread a body runs, or how we know to which method call the ?nal value co
103、mputed by the body will be returned. The answer is that in any given chord, at most one method may be synchronous. If there is such a method, then the body runs in th</p><p> public class Buffer {</p>
104、<p> public string Get() & public async Put(string s) {</p><p> return s; }</p><p> public string Get() & public async Put(int n) { </p><p> return n.ToString();
105、 </p><p><b> } </b></p><p><b> } </b></p><p> Now we have de?ned one method for getting data out of the buffer, but two methods for putting it in (whic
106、h happen to be distinguished by type rather than name). A call to Get() can synchronize with a call to either of the Put() methods. If there are queued calls to both Put()s, then which one synchronizes with a subsequent
107、Get() is unspeci?ed. </p><p> 3. INFORMAL SPECIFICATION </p><p> 3.1 Grammar</p><p> The syntactic extensions to the C grammar [ECMA 2001, Appendix C] are very minor. We add a n
108、ew keyword, async, and add it as an alternative return type: </p><p> returntype : := type | void | async. </p><p> This allows methods, delegates and interface methods to be declared asy
109、nchronous. In class member declarations, we replace method declaration with chord declaration: chord-declaration : := </p><p> Method-header [& method-header]? body </p&g
110、t;<p> Method-header : :=</p><p> attributes modi?ers returntype membername(formals). </p><p> We call a chord declaration trivial if it declares a single, synchronous method (i.e. it
111、is a standard C method declaration). </p><p> 3.2 WellFormedness</p><p> Extended classes are subject to a number of well formedness conditions: — Within a single method-header: </p>
112、<p> (1) If returntype is async then the formal parameter list formals may not contain any ref or out parameter modi?er.4 — Within a single chord-declaration: </p><p> (2) At most one method-header m
113、ay have a nonasync returntype. </p><p> (3) If the chord has a method-header with returntype type, then body may use return statements with type expressions, otherwise body may use empty return statements.
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 計算機(jī)外文翻譯--c#設(shè)計模式
- 計算機(jī)畢業(yè)設(shè)計外文翻譯
- 計算機(jī)外文翻譯---asp.net入門c#版
- 計算機(jī)專業(yè)畢業(yè)設(shè)計外文翻譯
- 計算機(jī)專業(yè)畢業(yè)設(shè)計-外文翻譯
- 計算機(jī)外文翻譯--c#程序的回歸測試選擇
- 計算機(jī)專業(yè)畢業(yè)設(shè)計外文翻譯27
- 計算機(jī)外文翻譯--c#程序的回歸測試選擇
- 計算機(jī)外文翻譯--c#程序的回歸測試選擇
- 計算機(jī)外文翻譯---c#程序的回歸測試選擇
- 計算機(jī)外文翻譯---c#程序的回歸測試選擇
- 計算機(jī)專業(yè)畢業(yè)設(shè)計外文翻譯--internet
- 計算機(jī)外文翻譯--c#程序的回歸測試選擇(英文)
- 計算機(jī)外文翻譯--C#程序的回歸測試選擇.docx
- 計算機(jī)外文翻譯--C#程序的回歸測試選擇.docx
- 計算機(jī)外文翻譯--C#程序的回歸測試選擇.docx
- 計算機(jī)外文翻譯--C#程序的回歸測試選擇.docx
- 計算機(jī)專業(yè)畢業(yè)設(shè)計-外文翻譯--統(tǒng)一建模語言 uml分層抽象建模機(jī)制
- 計算機(jī)專業(yè)畢業(yè)設(shè)計外文資料翻譯3
- 計算機(jī)畢業(yè)設(shè)計外文翻譯----php訪問mysql
評論
0/150
提交評論