多核程序設(shè)計(jì)課件5-windows多線程編程_第1頁
多核程序設(shè)計(jì)課件5-windows多線程編程_第2頁
多核程序設(shè)計(jì)課件5-windows多線程編程_第3頁
多核程序設(shè)計(jì)課件5-windows多線程編程_第4頁
多核程序設(shè)計(jì)課件5-windows多線程編程_第5頁
已閱讀5頁,還剩64頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

第四章多線程編程及調(diào)優(yōu)浙江大學(xué)計(jì)算機(jī)學(xué)院多線程在平臺(tái)下可以通過的線程庫來實(shí)現(xiàn)多線程編程提供的接口32或

實(shí)現(xiàn)方式的多樣化給編程帶來了很大的靈活性也使得多線程編程變得復(fù)雜線程庫32操作系統(tǒng)為內(nèi)核以及應(yīng)用程序之間提供的接口將內(nèi)核提供的功能進(jìn)行函數(shù)封裝應(yīng)用程序通過調(diào)用相關(guān)的函數(shù)獲得相應(yīng)的系統(tǒng)功能。微軟基礎(chǔ)函數(shù)類庫()用類庫的方式將32進(jìn)行封裝,以類的方式提供

構(gòu)成公共語言運(yùn)行庫(

,)文件加載器、垃圾收集器、安全系統(tǒng)類庫(

,)基礎(chǔ)類庫的命名空間提供了大量的類和接口來支持多線程所有與多線程機(jī)制相關(guān)的類都存放在命名空間中使用32線程32函數(shù)庫中提供了操作多線程的函數(shù),包括創(chuàng)建線程、管理線程、終止線程、線程同步等接口。提供操作系統(tǒng)級(jí)別的創(chuàng)建線程的操作線程函數(shù)();線程創(chuàng)建(,,,,,

);第一個(gè)參數(shù),是一個(gè)指向結(jié)構(gòu)的指針,該結(jié)構(gòu)制定了線程的安全屬性,缺省為。第二個(gè)參數(shù),是棧的大小,一般設(shè)置為0。第三個(gè)參數(shù)是新線程開始執(zhí)行時(shí),線程函數(shù)的入口地址。它必須是將要被新線程執(zhí)行的函數(shù)地址,不能為。參數(shù)指定了線程函數(shù)的地址,新建線程將從此地址開始執(zhí)行,直到語句返回,線程運(yùn)行結(jié)束,把控制權(quán)交給操作系統(tǒng)。第四個(gè)參數(shù),是線程函數(shù)定義的參數(shù)??梢酝ㄟ^這個(gè)參數(shù)傳送值,包括指針或者。第五個(gè)參數(shù),控制線程創(chuàng)建的附加標(biāo)志,可以設(shè)置兩種值。0表示線程在被創(chuàng)建后就會(huì)立即開始執(zhí)行;如果該參數(shù)為,則系統(tǒng)產(chǎn)生線程后,該線程處于掛起狀態(tài),并不馬上執(zhí)行,直至函數(shù)被調(diào)用;第六個(gè)參數(shù),為指向32位變量的指針,該參數(shù)接受所創(chuàng)建線程的號(hào)。如果創(chuàng)建成功則返回線程的句柄,否則返回。創(chuàng)建線程還可以用頭文件中聲明的C執(zhí)行時(shí)期鏈接庫函數(shù)。在回調(diào)入口函數(shù)之前進(jìn)行一些線程相關(guān)的的初始化操作語法: =((*)(*),,*);線程函數(shù)的語法: (*);使用創(chuàng)建線程的例子""<><><><>;1(){ (1) { (1000); <<"1"<<; }}2(){ (1) { (1000); <<"2"<<; }}(){ 0; (1,0); (2,0); (3000); <<""<<; 0;}線程管理設(shè)置線程的優(yōu)先級(jí)一個(gè)線程被創(chuàng)建時(shí),它的優(yōu)先級(jí)等于它所屬進(jìn)程的優(yōu)先級(jí)函數(shù)設(shè)置線程的相對(duì)優(yōu)先級(jí)(,)線程與包含它的進(jìn)程的優(yōu)先級(jí)關(guān)系如下:線程優(yōu)先級(jí)=進(jìn)程優(yōu)先級(jí)+線程相對(duì)優(yōu)先級(jí)設(shè)置線程的優(yōu)先級(jí)參數(shù)是指向待設(shè)置的線程句柄進(jìn)程的優(yōu)先級(jí)包括:實(shí)時(shí):;高:;高于正常:;正常:;低于正常:;空閑:。是線程的相對(duì)優(yōu)先級(jí),可以是以下的值:最高線程:- -2空閑:- 15最低線程:- 2低于正常線程:-1正常線程:- 0高于正常線程:-–1關(guān)鍵時(shí)間:-– -15線程的掛起與恢復(fù)進(jìn)程中的每個(gè)線程都有掛起計(jì)數(shù)器()當(dāng)掛起計(jì)數(shù)器值為0時(shí),線程被執(zhí)行當(dāng)掛起計(jì)數(shù)器值大于0時(shí),調(diào)度器不去調(diào)度該線程。不能夠直接訪問線程的掛起計(jì)數(shù)器掛起();恢復(fù)();原型 (); 掛起指定的線程 如果函數(shù)執(zhí)行成功,則線程的執(zhí)行被終止 每次調(diào)用()函數(shù),線程將掛起計(jì)數(shù)器的值增1

(); 結(jié)束線程的掛起狀態(tài)來執(zhí)行這個(gè)線程 每次調(diào)用()函數(shù),線程將掛起計(jì)數(shù)器的值減1 若掛起計(jì)數(shù)器的值為0,則不會(huì)再減線程等待一組能使線程阻塞其自身執(zhí)行的等待函數(shù)在其參數(shù)中的一個(gè)或多個(gè)同步對(duì)象產(chǎn)生了信號(hào),或者超過規(guī)定的等待時(shí)間才會(huì)返回在等待函數(shù)未返回時(shí),線程處于等待狀態(tài),線程只消耗很少的時(shí)間線程終結(jié)在線程函數(shù)返回時(shí),線程自動(dòng)終止在線程的執(zhí)行過程中終止則可調(diào)用函數(shù):();棧;取消;結(jié)束線程如果在線程的外面終止線程,則可調(diào)用下面的函數(shù): (,);32多線程的實(shí)現(xiàn)下面這個(gè)程序首先創(chuàng)建兩個(gè)線程,當(dāng)輸入為1時(shí),執(zhí)行線程,否則掛起線程。 <><>;

(){(){(1000);<<"!";}0;}(){(){(1000);<<"!";}0;}32多線程的實(shí)現(xiàn)(續(xù))(,*[]){0;1(,0,,(*),,);2(,0,,(*),,);(){>>;(1){ (1); (2);}

{ (1); (2);}};(1,1);(2,1);0;}線程執(zhí)行和資源存取線程之間通信的兩個(gè)基本問題是互斥和同步線程同步是指線程之間所具有的一種制約關(guān)系,一個(gè)線程的執(zhí)行依賴另一個(gè)線程的消息,當(dāng)它沒有得到另一個(gè)線程的消息時(shí)應(yīng)該等待,直到消息到達(dá)時(shí)才被喚醒。線程互斥是指對(duì)于共享資源,在各線程訪問時(shí)的排它性線程互斥是一種特殊的線程同步32線程同步的實(shí)現(xiàn)全局變量事件()臨界區(qū)()互斥量()信號(hào)量()32線程同步的實(shí)現(xiàn)-全局變量全局變量進(jìn)程中的所有線程均可以訪問所有的全局變量,因而全局變量成為32多線程通信的最簡單方式。;全局變量(){ () { 線程處理 } 0;}是一個(gè)全局變量,任何線程均可以訪問和修改。線程間可以利用此特性達(dá)到線程同步的目的。用全局變量同步線程的例子<><>;=;(){ <<""<<; (200); =; 0;}問題:主線程等待為真,如不為真則一直循環(huán),這樣占用了資源如果主線程優(yōu)先級(jí)高于,則一直不會(huì)被置為真(){ =(,0,,,0,); () { <<"!"<<; (); } () <<""<<; <<""<<; 0;}事件事件()是32提供的最靈活的線程間同步方式用來發(fā)送命令或觸發(fā)事件,安排事件執(zhí)行的先后次序事件存在兩種狀態(tài):激發(fā)狀態(tài)()未激發(fā)狀態(tài)()事件可分為兩類:手動(dòng)設(shè)置這種對(duì)象只能用程序來手動(dòng)設(shè)置,在需要該事件或者事件發(fā)生時(shí),采用及來進(jìn)行設(shè)置。自動(dòng)恢復(fù)一旦事件發(fā)生并被處理后,自動(dòng)恢復(fù)到?jīng)]有事件狀態(tài),不需要再次設(shè)置。手動(dòng)重置事件被設(shè)置為激發(fā)狀態(tài)后,會(huì)喚醒所有等待的線程,而且一直保持為激發(fā)狀態(tài),直到程序重新把它設(shè)置為未激發(fā)狀態(tài)。自動(dòng)重置事件被設(shè)置為激發(fā)狀態(tài)后,會(huì)喚醒“一個(gè)”等待中的線程,然后自動(dòng)恢復(fù)為未激發(fā)狀態(tài)原型為:(,,,

);其中: 第一個(gè)參數(shù):與中的第一個(gè)參數(shù)類似,是一個(gè)指向結(jié)構(gòu)的指針 第二個(gè)參數(shù):代表事件的類型,是手動(dòng)清除事件信號(hào)還是自動(dòng)清除事件信號(hào)。為手動(dòng)清除。 第三個(gè)參數(shù):指明事件的初始狀態(tài) 第四個(gè)參數(shù):事件的名稱使用“事件”機(jī)制注意事項(xiàng)(1)設(shè)置事件是否要自動(dòng)恢復(fù);(2)設(shè)置事件的初始狀態(tài);(3)如果跨進(jìn)程訪問事件,必須對(duì)事件命名,在對(duì)事件命名的時(shí)候,要注意不要與系統(tǒng)命名空間中的其它全局命名對(duì)象沖突事件對(duì)象屬于內(nèi)核對(duì)象進(jìn)程A可以通過調(diào)用函數(shù)根據(jù)對(duì)象的名字獲得進(jìn)程B中對(duì)象的句柄,然后對(duì)這個(gè)句柄可以使用、和等函數(shù)進(jìn)行操作來實(shí)現(xiàn)一個(gè)進(jìn)程的線程控制另一進(jìn)程中線程的運(yùn)行當(dāng)程序中一個(gè)線程的運(yùn)行要等待另外一個(gè)線程中一項(xiàng)特定的操作的完成才能繼續(xù)執(zhí)行時(shí),就可以使用事件對(duì)象來通知等待線程某個(gè)條件已滿足事件機(jī)制例子有三個(gè)線程主線程、讀線程、寫線程讀線程必須在寫線程的寫操作完成之后才能進(jìn)行讀操作主線程必須在讀線程的讀操作完成后才結(jié)束定義兩個(gè)事件對(duì)象,由寫線程用于通知讀線程進(jìn)行讀操作由讀線程用于通知主線程讀操作已經(jīng)結(jié)束""<><><><>;,;(){ (); <<""<<; ();程序輸出如下:.

(){ <<""<<; ();}(,*[]){ =(); =(); (,0,); (,0,); (); <<""<<; 0;}臨界區(qū)一種防止多個(gè)線程同時(shí)執(zhí)行一個(gè)特定代碼段的機(jī)制適用于多個(gè)線程操作之間沒有先后順序但要求互斥的同步多個(gè)線程訪問同一個(gè)臨界區(qū)的原則:一次最多只能一個(gè)線程停留在臨界區(qū)內(nèi)不能讓一個(gè)線程無限地停留在臨界區(qū)內(nèi),否則其它線程將不能進(jìn)入該臨界區(qū)定義臨界區(qū)變量的方法如下: ; 通常情況下,結(jié)構(gòu)體應(yīng)該被定義為全局變量,便于進(jìn)程中的所有線程可以方便地按照變量名來引用該結(jié)構(gòu)體。相關(guān)初始化臨界區(qū)(

);刪除臨界區(qū)(

);進(jìn)入臨界區(qū)(

);離開臨界區(qū)(

);使用臨界區(qū)編程的一般方法是:(){();

();}例子假如一個(gè)銀行系統(tǒng)有兩個(gè)線程執(zhí)行取款任務(wù),一個(gè)使用存折在柜臺(tái)取款,一個(gè)使用銀行卡在取款。若不加控制,很可能賬戶余額不足兩次取款的總額,但還可以把錢取走。""<><><><>;=100;[2];;1(){ (); (90>=0) { 90; <<"90"<<; }

<<""<<; (); ([0]);}2(){ (); (20>=0){ 20; <<"20"<<; }

<<""<<; (); (); ([1]);}(,*[]){ [0]=(); [1]=(); (); (1,0,); (2,0,); (2); (); <<<<; 0;}互斥量通常用于協(xié)調(diào)多個(gè)線程或進(jìn)程的活動(dòng),通過“鎖定”和“取消鎖定”資源,控制對(duì)共享資源的訪問。互斥量的作用是保證每次只能有一個(gè)線程獲得互斥量使用函數(shù)創(chuàng)建:(安全屬性,如果為0,則不可繼承,

);有關(guān)的:創(chuàng)建一個(gè)互斥對(duì)象,返回對(duì)象句柄;打開并返回一個(gè)已存在的互斥對(duì)象的句柄,使之后續(xù)訪問;釋放對(duì)互斥對(duì)象的占用,使之成為可用;使用互斥量的一般方法是:(){(,…);

();}例子""<><> 3=;=0;(*){ =(*(*)); ; <<":"<<<<"!"<<; ((=(,,""))){ <<"!"<<; } <<""<<<<""<<; (); (); 0;}續(xù)1(,*[]){ i; []; h[]; ; ((=(,,""))){ ((=(,,""))){ <<"!"<<; 0; } } (0<) { h[i]=(, 0, (), (*)[i], 0, &([i])); 續(xù)2(h[i]) <<""<<[i]<<;

<<":"<<[i]<<;

} (); <<"!"<<; (); 0;}程序運(yùn)行結(jié)果::1796:1796!1796:2140:2140!2140:2448:2448!2448!信號(hào)量信號(hào)量是一個(gè)核心對(duì)象,擁有一個(gè)計(jì)數(shù)器,可用來管理大量有限的系統(tǒng)資源當(dāng)計(jì)數(shù)值大于零時(shí),信號(hào)量為有信號(hào)狀態(tài)當(dāng)計(jì)數(shù)值為零時(shí),信號(hào)量處于無信號(hào)狀態(tài)創(chuàng)建信號(hào)量(,,,信號(hào)量的名稱);釋放信號(hào)量(,,信號(hào)量的當(dāng)前資源數(shù)增加

);打開信號(hào)量(,,,.,.

);使用信號(hào)量機(jī)制同步線程例子""<><> 3(*){ =(*(*)); ; <<":"<<<<"!"<<; ((=(,,""))){ <<"!"<<; } <<""<<<<""<<; (,1,); (); 0;}例子續(xù)(,*[]){ i; []; []; ;

((=(,0,1,""))){ <<"!"<<; 0; } (0<) { [i]=(, 0, (), (*)[i], 0, &([i]));續(xù)2([i]) <<""<<[i]<<;

<<":"<<[i]<<;

} (); <<"!"<<; (); 0;}程序運(yùn)行結(jié)果::2684:2684!2684:904:904!904:1612:1612!1612!原子操作獲得互斥量以及其他鎖原語的開銷是非常大的互鎖特殊的指令,這些指令使開發(fā)人員可以快速執(zhí)行普通的原子操作,而不會(huì)帶來鎖獲取所導(dǎo)致的開銷原子操作(續(xù))互鎖函數(shù)提供了32位和64位變量的原子操作。這些函數(shù)主要進(jìn)行以下操作:()完成一個(gè)原子操作,將遞增一個(gè)32位變量。該函數(shù)的64位版本是64()。()完成一個(gè)原子操作,遞減一個(gè)32位變量。該函數(shù)的64位版本是64()。()完成一個(gè)原子操作,將一個(gè)32位的值賦給另一個(gè)目標(biāo)變量。該函數(shù)的64位版本是64()。若需要交換指針,可以使用()函數(shù)。()完成一個(gè)原子操作,相當(dāng)于C語言中的操作。該函數(shù)把32位目標(biāo)變量與一個(gè)給定值相加,并將二者的和賦給該目標(biāo)變量。該函數(shù)的64位版本是64()。()完成一個(gè)原子操作,將比較數(shù)()與目標(biāo)值比較,若結(jié)果為真,則更新目標(biāo)值互鎖函數(shù)還提供了對(duì)單鏈表進(jìn)行原子訪問的支持線程池從2000起,開始提供線程池使用線程池最重要的函數(shù)是():(,,);該函數(shù)的前兩個(gè)參數(shù)和前文所述的創(chuàng)建線程所使用函數(shù)的參數(shù)是一類的。()例程是一個(gè)函數(shù)指針,指向線程池中的線程必須要完成的工作。該函數(shù)必須具有以下形式:();該例程的返回值是線程的退出碼,該退出碼也可以通過調(diào)用()獲得。線程池(續(xù))當(dāng)?shù)谝淮握{(diào)用()時(shí),將創(chuàng)建一個(gè)線程池其中的一個(gè)線程將執(zhí)行函數(shù),函數(shù)執(zhí)行完成后,該線程返回線程池,等待新的任務(wù)。當(dāng)使用多個(gè)線程對(duì)目標(biāo)工作進(jìn)行功能分解時(shí),可以考慮使用線程池來減輕程序設(shè)計(jì)負(fù)擔(dān)使有機(jī)會(huì)協(xié)助進(jìn)行線程的管理,從而使應(yīng)用程序能夠達(dá)到最佳的性能處理器親和當(dāng)線程被調(diào)度執(zhí)行時(shí),將負(fù)責(zé)確定線程運(yùn)行在哪個(gè)處理器上。選擇處理器所使用的策略稱為軟親和()該策略建議調(diào)度程序盡可能地將線程放在線程先前所運(yùn)行的處理器上執(zhí)行。采用該策略主要是考慮這樣可以最好地利用可能仍緩存在原處理器內(nèi)的數(shù)據(jù)。親和(),或者說線程對(duì)其所運(yùn)行處理器的優(yōu)先選擇,可以由開發(fā)人員設(shè)置。處理器親和(續(xù))為了在線程和處理器核之間達(dá)到負(fù)載平衡,需要告知,線程將在哪個(gè)處理器上執(zhí)行。( , );參數(shù)實(shí)際上是一個(gè)無符號(hào)整數(shù)。若線程可以被調(diào)度到某個(gè)邏輯處理器上運(yùn)行,那么該處理器在上所對(duì)應(yīng)的位將被置1。例如,若線程可以被調(diào)度到第一個(gè)處理器核(即核0)上運(yùn)行,則親和掩碼設(shè)置為0x01;若可以被調(diào)度到第二個(gè)處理器核(即核1)上,則親和掩碼可設(shè)置為0x02;若一個(gè)線程既可以運(yùn)行在核0又可以運(yùn)行在核1上,則對(duì)應(yīng)的親和掩碼為0x03,依此類推??梢酝ㄟ^調(diào)用下面的函數(shù)獲得進(jìn)程的親和掩碼:

進(jìn)程親和掩碼可以在程序內(nèi)通過調(diào)用下面的函數(shù)進(jìn)行設(shè)置:

線程同步的實(shí)現(xiàn)()來創(chuàng)建一個(gè)對(duì)象。()函數(shù)用來啟動(dòng)新的線程同步類只允許當(dāng)前進(jìn)程中的一個(gè)線程訪問某個(gè)對(duì)象的同步類只允許系統(tǒng)中一個(gè)進(jìn)程內(nèi)的一個(gè)線程訪問某個(gè)對(duì)象的同步類只允許一到某個(gè)指定數(shù)目個(gè)線程同時(shí)訪問某個(gè)對(duì)象的同步類當(dāng)某個(gè)事件發(fā)生時(shí)通知一個(gè)應(yīng)用程序的同步類例子中如何創(chuàng)建線程以及線程間如何實(shí)現(xiàn)同步的程序說明創(chuàng)建工程,對(duì)四個(gè)數(shù)組進(jìn)行快速排序后,通過信號(hào)量同步機(jī)制,控制在屏幕依次顯示每個(gè)數(shù)組經(jīng)過排序后的輸出。(如不使用信號(hào)量,則屏幕顯示數(shù)組的數(shù)字次序混亂)全局變量和數(shù)組:用作信號(hào)量,控制數(shù)組的依次打印窗口對(duì)象句柄1[]={12,32,47,763,75,43,86,42};2[]={432,68,36,84,47,73,732,46};3[]={435,754,37,765,48,785,326,78};4[]={54,76,93,457,456,34,94,50};函數(shù)(*,,){(>=)1;=[];=

=;(<){([]>=>);[]=[];([]<<);[]=[];}[]=;(1);(,1,);0;}(p){*=(*)p;[512];(,'\0',512);;i;(,0,7);=(,)(0;i<8;){(,"",[i]);(,,,()());(100);}(,"\r\n");(,,,()());(,1,);0;}運(yùn)行的主要代碼:=(,1,1,)創(chuàng)建信號(hào)量()();創(chuàng)建四個(gè)線程:(,()1,);(,()2,);(,()3,);(,()4,);運(yùn)行結(jié)果:1232424347758676336464768738443273237487832643575476578534054769394456457不使用信號(hào)量(程序中去掉()和()函數(shù))的運(yùn)行結(jié)果之一: 12363734324648504247785443683267647734359375847549486432765456763732785457線程做通用語言運(yùn)行時(shí)(,)在中程序是以中間代碼的形式執(zhí)行的在概念上和的字節(jié)碼相似框架對(duì)線程提供了廣泛的支持線程同步應(yīng)用程序是基于框架的是框架的重要組成部分是支持多線程的所有應(yīng)用程序都可以實(shí)現(xiàn)多線程可使用或者框架的語言來設(shè)計(jì)多線程程序命名空間下包含了在框架中進(jìn)行多線程編程所需要的類,因此在程序中首先要聲明程序位于命名空間。線程同步的實(shí)現(xiàn)創(chuàng)建輔助(或從屬)線程的第一個(gè)步驟是創(chuàng)建代理,指定要由該線程執(zhí)行的線程函數(shù)。然后將代理傳遞給類的構(gòu)造函數(shù)。=()t=()();線程創(chuàng)建好后,可以使用類下的方法對(duì)線程進(jìn)行控制:

繼續(xù)已掛起的線程。

已重載。將當(dāng)前線程阻塞指定的毫秒數(shù)。

掛起線程,或者如果線程已掛起,則不起作用。

調(diào)用此方法通常會(huì)終止線程。線程創(chuàng)建;t=(());對(duì)()的調(diào)用將創(chuàng)建一個(gè)新的線程。其參數(shù)是一個(gè)叫做的委托()。在里,委托等價(jià)于C函數(shù)中的函數(shù)地址。它是一種不用進(jìn)行實(shí)際調(diào)用而對(duì)函數(shù)或方法進(jìn)行標(biāo)識(shí)的方式。和32中相同,當(dāng)()終止時(shí),線程也將終止線程創(chuàng)建(續(xù))啟動(dòng)等待線程時(shí)必須調(diào)用()提供了一個(gè)特殊值0來指示主線程應(yīng)一直掛起直到所有等待的線程都已經(jīng)開始執(zhí)行另一個(gè)特殊值則通知調(diào)度程序?qū)⒃摼€程無限期掛起32和的重要區(qū)別32中,線程的創(chuàng)建會(huì)自動(dòng)向調(diào)度程序產(chǎn)生一個(gè)執(zhí)行該線程的請(qǐng)求,而不需要多余的步驟。在中,線程必須由()方法顯式地啟動(dòng)線程優(yōu)先級(jí)框架支持以下五種級(jí)別的線程優(yōu)先級(jí):最高()普通上()普通()(默認(rèn)級(jí)別)普通下()最低()例子(來源于);;

{(){=();=();();w=();=42;=();=();();}}

{(){(".");};(){(".{0}",);}}提供了很多的類和數(shù)據(jù)類型來控制對(duì)共享資源的訪問。常用的類有:

類非常適合于在給定的時(shí)間和指定的代碼段只能被一個(gè)線程訪問情況下的線程同步。

類作為基類來使用的,它允許多個(gè)等待操作。這個(gè)類封裝了32的同步處理方法。對(duì)象通知其他的線程它需要對(duì)資源排他性的訪問,其他的線程必須等待,直到不再使用資源和等待句柄沒有被使用。

允許一個(gè)線程獨(dú)占共享資源的同時(shí)阻止其他線程和進(jìn)程的訪問。

這個(gè)類可以通知一個(gè)或多個(gè)線程發(fā)生事件。

這個(gè)類也用來通知一個(gè)或多個(gè)線程事件發(fā)生了。它的狀態(tài)可以手動(dòng)的被設(shè)置和重置。

它提供了在線程之間共享的變量訪問的同步,它的操作是原子操作,且被線程共享。

它定義了一種鎖,提供唯一寫/多讀的機(jī)制,使得讀寫的同步銀行取款為例;;

{=100;1(){90;(n<=){n;(".{0}",n);("{0}",);}

{(".{0}",n);("{0}",);}}2(){n=20;(n<=){n;(".{0}",n);("{0}",);}

{(".{0}",n);("{0}",);}}(){1=(1);1=(1);2=(2);2=(2);1();2();

}}可能出現(xiàn)這種情況當(dāng)某個(gè)線程調(diào)用1方法時(shí),這時(shí)的值為100,而正當(dāng)要減去90的時(shí)候,另外一個(gè)線程調(diào)用了2,它要減去20,結(jié)果減去了20,然后又在原先=100的值的情況下減掉了90,最后的結(jié)果是被減去了90,而沒有減去20。很明顯方法和方法是不能同時(shí)被調(diào)用的,所以必須進(jìn)行線程同步處理簡單的方法是用語句(){(n<=){n;(".{0}",n);("{0}",);}

{(".{0}",n);("{0}",);}}也可以使用類的方法基本一樣:(){(n<=){n;(".{0}",n);("{0}",);}

{(".{0}",n);("{0}",);}}()也可以使用以及其他同步機(jī)制來實(shí)現(xiàn)線程間同步的目的大家試一試線程命名兩種方式一種是在程序中使用函數(shù)設(shè)置線程名稱另一種是在托管代碼內(nèi)使用中類中的屬性來設(shè)置線程名稱環(huán)境下,每個(gè)線程與一個(gè)線程直接匹配多線程環(huán)境下,使用調(diào)試工具跟蹤各個(gè)線程的比較困難()函數(shù)兩個(gè)參數(shù)線程,建議對(duì)置-1,表示函數(shù)將使用所在線程為要設(shè)置的線程名稱調(diào)試器中給出的使用調(diào)試器調(diào)試線程的一些提示和一些常見的問題在多線程代碼中,使用跟蹤點(diǎn)可以檢查出程序中的許多??梢允褂脭帱c(diǎn)篩選器將斷點(diǎn)置于單個(gè)線程上。如果我們通過用戶界面來調(diào)試多線程應(yīng)用程序可能比較困難,那么可以考慮在另一臺(tái)機(jī)器上運(yùn)行應(yīng)用程序并使用遠(yuǎn)程調(diào)試。 可以在本機(jī)代碼中使用或在托管代碼中使用屬性來設(shè)置

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論