版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、實(shí)驗(yàn)九POSIX線程機(jī)制一實(shí)驗(yàn)?zāi)康模?. 理解進(jìn)程與線程的區(qū)別;2. 實(shí)現(xiàn)單線程與多線程控制;3. 了解POSIX線程機(jī)制,使用常用的線程操作函數(shù)實(shí)驗(yàn)內(nèi)容:1. 觀察單線程程序和多線程程序的區(qū)別;2. 使用常用的線程操作函數(shù)。實(shí)驗(yàn)步驟:(一)“ hello world單線程程序調(diào)試并運(yùn)行下面的程序,如圖/hello world單線程程序# in elude con st NUM = 5;int mai n()/ void p_msg(char *);p_msg(hello);P_msg(worldn);1所示,觀察輸出結(jié)果,并分析原因void p_msg(char *m)int i;for(i
2、 = 0 ; i NUM ; i +)prin tf(%s,m); fflush(stdout);sleep(1);圖1單線程程序(roatlora Lt:lod Ihoit raotltt liaJiacotida-k .cfg i .util inwL 廿 ll-lo* in u 11. log . sys Jogt .croutl 口 cnllujsL rco t g cc -q11 tzll.cles t I . : I 5 3 us rn in耳: type imi 弓 rm tr h wi l h prev ions inrp I i c i t dec ra t ionles 1
3、1.c18: warning; prev iou i np I i c j t dtcla ra t ion of p_TFg11 .: 12: usrn ing : p_iYne佃空 provioLsly iiipI it it ly do? larod to return iniH les LI . c :20 :2: 碣rniitg: noin亡 j L f nd of fileI rootflora Rj(is i too tti . / 1e s 11he 11qhe I lobe I lobe I lohe I lovor Id.wjt Idiw Idvut)r Idwu r I
4、d rootfloca llios t roo tW |結(jié)果分析:先運(yùn)行 p_msg(hello),后運(yùn)行p_msg(worldn),故先輸出5個(gè)hello , 1個(gè)world 跟在后面,4個(gè)world換行回車。(二) 使用pthread_create創(chuàng)建線程如果希望一個(gè)程序能同時(shí)并發(fā)執(zhí)行很多函數(shù),它可以通過(guò)創(chuàng)建多個(gè)線程實(shí)現(xiàn),只要將上面的程序做兩個(gè)小的改動(dòng),即可讓程序并發(fā)執(zhí)行兩個(gè)函數(shù)。圖2中的程序是一個(gè)簡(jiǎn)單“ hello world ”多線程程序void *p_msg(void *m)int i;for(i = 0 ; i 5 ; i +) prin tf(%s,m); fflush(stdo
5、ut); sleep(1);return NULL;#i nclude #i nclude main ()pthread_t t1 , t2;void *p_msg(void *);pthread_create(&t1,NULL,p_msg,(void * )hello ); pthread_create(&t2,NULL,p_msg,(void * )worldn”); pthread_join(t1, NULL);pthread_join(t2, NULL);圖2多線程程序提示:POSIX標(biāo)準(zhǔn)族中包含有線程標(biāo)準(zhǔn),有關(guān)的系統(tǒng)調(diào)用名字以“ pthread_” 打頭。為了使用這些函數(shù),須對(duì)REE
6、NTRANT宏進(jìn)行定義,該宏包括在頭文件pthread.h中,鏈接這些線程函數(shù)庫(kù)時(shí)要使用編譯器命令的“-lpthread ”選項(xiàng)思考:結(jié)果:icoiloca ha I root# gcc -oltisi2.c - Ip ihreadif s i2 . c: n func I i on iih in:les |2 , c:S; rn ing ;; ing j rgnf pthread .rea t p from i nr打叩且 t ih W poini e rtypeit s t2 .c:9: vfiiniftg : paing jrg 3 of pihread_-crci11 from inn
7、pit ih I poinif r typ*te s 1224 7 2 : varnm 耳;no new ine a t e nd of f i leroo t-Moca 1 ho刃 t ana cunda-k .cfg J uu tro-o lr 14 h電 I IciMur l-d li I Iumof I1將 pthread_join 刪除后:rQt(?iuua I hua l run t fl / Le s t2_2 he J lotMjr IdrodMoca I hcs i too t # ./test2_2he I lnwir Iri會(huì)這樣是因?yàn)閮蓚€(gè)線程在sleep (1)的時(shí)間里
8、進(jìn)程運(yùn)行完畢結(jié)束。線程被迫結(jié) 束。iv. 進(jìn)程放后臺(tái)運(yùn)行,用ps觀察進(jìn)程狀態(tài),用pstree觀察是否有子進(jìn)程產(chǎn)生。roolloca I hcs t ruo L ./ te i t5 A1 I2U1roor?loca Iho$ I rootle he I lor IdFID TTYnrrCJD2577 pis/fl0000:1)0wtl12181 pis/fl;()()test212184 pti/O00:00:01)PSf rootlocAIhoii roo t# hellouorId he I IqudtIdhe 11 nun r Idhe 1 lower Id-iioin?-irrmi n
9、i l一+-da sti-+-ps treeI-lestS-gnonv-piy-heI pc沒(méi)有子進(jìn)程產(chǎn)生v. 改寫代碼,使同樣的輸出內(nèi)容由并發(fā)的父子進(jìn)程實(shí)現(xiàn)。進(jìn)程放后臺(tái)運(yùn)行,用ps觀察進(jìn)程狀態(tài)。與先前的觀察有什么不同?請(qǐng)分析原因, 體會(huì)進(jìn)程和線程概念的差異。test3.c#i nclude const NUM = 5;int main() / void p_msg(char *);int p1;while(p 仁fork()=-1);if(p10) /* 主進(jìn)程的處理*/int i;sleep(5);for(i = 0 ; i NUM ; i +) prin tf(hellon); slee
10、p(1);wait(0);exit(0);elseint i;sleep(5);for(i = 0 ; i NUM ; i +) prin tf(worldn); sleep(1);exit(0); 有子進(jìn)程產(chǎn)生:-|jncne-termi nll在我所安裝的la l_ba sh-+ps t ree-te s t31e 512linux版本中,ps只能顯示父進(jìn)程:j od l / loc-a Ih口生t i qo 訂# pstie Ir IdFID TTYTJhf ED3110 pls/fl00:00:00 hash329900=00:00 teit3aaoa pls/oUO:00:(UJ p
11、s當(dāng)子進(jìn)程運(yùn)行完,父進(jìn)程未退出時(shí)可以看到子進(jìn)程變?yōu)榻┦M(jìn)程1*001:!* lor 3 1 h()t raal* psLID rrvTJMl CAD31W pLs/O0600:00 bash3271 pis/flQOiOOiOti tes.t33272 pis/fl00:00:00 tes-tS 3280 pis/flCO:00:0(! pa(三) 觀察并發(fā)的線程運(yùn)行圖3中的程序,觀察線程并發(fā)執(zhí)行的效果及存在互相干擾的效果#i nclude #i nclude #i nclude void *Pri ntThread(void * );#defi ne Num_Threads 3int mai
12、 n()int i,ret;pthread_t a_thread;int ThdNumNum_Threads;for (i = 0; i Num_Threads; i+)ThdNumi = i;for(i = 0; i Num_Threads;i+)ret = pthread_create(&a_thread,NULL,Pri ntThread,(void *)& ThdNumi);if (ret = 0)prin tf(Thread laun ched succeddfullyn);i = getchar();return (0);void *Pri ntThread(void * num)
13、int i;for(i = 0;i 5; i+)prin tf(thread number is %dn,*(i nt *)n um);sleep(1);return NULL;圖3多線程的并發(fā)思考:編譯連接通過(guò)后,多次運(yùn)行程序,查看輸出結(jié)果,并分析結(jié)果產(chǎn)生的原因root1 oca Ihost roo1./pthreadsthread nurrber 0I bread nurrbe r i s 0Thread launched sucrcdilfu I ylliread nuliber 1 s 】th read nunbe r 】& 1Thread l-atknch&d succcdJfu 1
14、 lythread nunber i a 2thread n-uiibcr i2Thread lonched sycEdifu 1 lyilircad nunber is 0Llireaii nuiihe r i 1thread nunber i s 1ihi cad minbe r j s 0ilireid nuiiber 注 1Llireiil nuiibe r i i 1tliread iiunber i& 0ihiead minbe r i s 1Lliread nuiibor is 1一開(kāi)始輸出兩個(gè)線程一樣是由于線程運(yùn)行比主程序快,最后面9個(gè)應(yīng)該是線程競(jìng)爭(zhēng)造成的。(四)編寫字?jǐn)?shù)統(tǒng)計(jì)工
15、具使用Linux下的多線程編程,編寫類似 wc(字?jǐn)?shù)統(tǒng)計(jì))的工具,使得程序能 同時(shí)對(duì)兩個(gè)文件進(jìn)行字?jǐn)?shù)統(tǒng)計(jì),然后得到兩個(gè)文件的總單詞數(shù)。進(jìn)程有獨(dú)立的數(shù) 據(jù)空間,在此進(jìn)程運(yùn)行的所有線程都擁有對(duì)這些數(shù)據(jù)的訪問(wèn)權(quán)。在某一時(shí)刻只允許唯一的線程對(duì)變量進(jìn)行訪問(wèn)。如果進(jìn)程中的任何線程修改了某一個(gè)數(shù)據(jù),所有擁有此數(shù)據(jù)的線程必須采取一定策略來(lái)避免訪問(wèn)沖突。區(qū)分單詞的規(guī)則:凡是一個(gè)非字母或者數(shù)字的字符跟在字母或者數(shù)字的后 面,那么這個(gè)字母或者數(shù)字就是單詞的結(jié)尾。本次實(shí)驗(yàn)編寫的是帶瑕疵的字?jǐn)?shù)統(tǒng)計(jì)工具,問(wèn)題留到下一次實(shí)驗(yàn)中用POSIX 的互斥量解決。兩個(gè)線程共享一個(gè)通用計(jì)數(shù)器,每個(gè)線程分別負(fù)責(zé)對(duì)一個(gè)文件進(jìn) 行計(jì)算,所有
16、的線程在檢查到單詞的時(shí)候?qū)ν粋€(gè)計(jì)數(shù)器增值,但是允許線程在沒(méi)有任何避免訪問(wèn)沖突策略的情況下來(lái)修改臨界資源一一通用計(jì)數(shù)器,因而可能會(huì)產(chǎn)生臟數(shù)據(jù)。參考代碼詳見(jiàn)圖4中的程序。所有線程對(duì)同一個(gè)計(jì)數(shù)器進(jìn)行操作,并且同時(shí)進(jìn)行。使用下述代碼temp=total_words;sleep(1);total_words=temp+1;是為了延時(shí),使產(chǎn)生臟數(shù)據(jù)的效果明顯。也就是程序先將計(jì)數(shù)器當(dāng)前的值存入寄存器中,加 1操作后,再將其寫回到內(nèi)存中。 當(dāng)所有線程在同一時(shí)刻都進(jìn)行讀取內(nèi)存一加1-寫回”的序列操作完成對(duì)寄存器的操作。#include #include #include int total_words = 0
17、;main(int ac , char * av)pthread_t t1, t2;void *count_words(void *);if(ac!=3) printf(usage: %s file1 file2n, av0); exit(1); pthread_create(&t1,NULL,count_words,(void * ) av1); pthread_create(&t2,NULL,count_words,(void * ) av2); pthread_join(t1, NULL); pthread_join(t2, NULL); printf(%5d: total wordsn
18、, total_words);void *count_words(void *f)char *filename = (char * )f;FILE *fp;int c, temp, prevc = 0;if(fp = fopen (filename, r ) != NULL) while(c = getc(fp)!= EOF) if(!isalnum(c)& isalnum(prevc) temp=total_words;sleep(1); /* 延時(shí),使產(chǎn)生臟數(shù)據(jù) */ total_words=temp+1; prevc =c; fclose(fp); elseprin tf(err fil
19、e name);return NULL;圖4單詞統(tǒng)計(jì)工具思考:i. 編譯連接通過(guò)后,多次運(yùn)行程序,查看輸出結(jié)果。Lhofit root I# J佔(zhàn) vrdrd24; lota 1 wordsrooilofj II roo11 fl ”Am? rd2 u)rd4: Lu J uurdsii. 統(tǒng)計(jì)數(shù)據(jù)正確嗎?如果錯(cuò)誤,請(qǐng)分析原因。統(tǒng)計(jì)結(jié)果并不正確。我在 word內(nèi)寫入1個(gè)單詞,在word2內(nèi)寫入4個(gè)單詞???共應(yīng)該是五個(gè)單詞。temp=total_words;sleep(1);total_words=temp+1;程序先將計(jì)數(shù)器當(dāng)前的值存入寄存器中,加1操作后,再將其寫回到內(nèi)存中。當(dāng)所有線程在同
20、一時(shí)刻都進(jìn)行 讀取內(nèi)存一加1-寫回”的序列操作完成對(duì)寄存器的 操作。word1和word2內(nèi)的第一個(gè)單詞相當(dāng)于只在中數(shù)上加了一次。iii. 刪除sleep(1);語(yǔ)句,對(duì)運(yùn)行結(jié)果有何影響?這能從本質(zhì)上避免產(chǎn)生 臟數(shù)據(jù)嗎?刪除后運(yùn)行結(jié)果變正確了,但這不能從本質(zhì)上避免產(chǎn)生臟數(shù)據(jù)。sleep(1)只是使 發(fā)生錯(cuò)誤的概率增大。ruutlhusl ruu l./wcl urd Mrd左5: lot-3 I words(五) 編程題創(chuàng)建兩個(gè)并發(fā)線程,一個(gè)線程輸出奇數(shù),另一個(gè)線程則輸出偶數(shù)。mywrite1.c#i nclude #include #include void *PrintThread(voi
21、d * );#define Num_Threads 2int main()int i,ret0,ret1;pthread_t a_thread;int ThdNumNum_Threads;for (i = 0; i Num_Threads; i+)ThdNum0 = 0;ThdNum1 = 1;ret0 = pthread_create(&a_thread,NULL,PrintThread,(void *)&ThdNum0); ret1 = pthread_create(&a_thread,NULL,PrintThread,(void *)&ThdNum1); if (ret0 = 0)printf(Thread launched succeddfullyn);if (ret1 = 0)printf(Thread launched succeddfullyn);i = getchar();return (0);void *PrintThread(void * num)int i;for(i = 0;i o tgee -0ri mi i tIho
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 《管理會(huì)計(jì) 第3版》 課件 第01章 管理會(huì)計(jì)概述
- 微積分 第3版 課件 7第七節(jié) 二重積分
- 高考語(yǔ)文真題分類卷-專題六 文學(xué)類文本閱讀(含答案)
- 動(dòng)物之最課件教學(xué)課件
- 網(wǎng)絡(luò)接入?yún)f(xié)議書(shū)(2篇)
- 黨群服務(wù)中心建設(shè)工作總結(jié)匯報(bào)
- 南京航空航天大學(xué)《薄膜材料與技術(shù)》2022-2023學(xué)年第一學(xué)期期末試卷
- 南京工業(yè)大學(xué)浦江學(xué)院《食品工藝學(xué)》2023-2024學(xué)年第一學(xué)期期末試卷
- 富陽(yáng)佳苑4#樓施工組織設(shè)計(jì)
- 南京工業(yè)大學(xué)浦江學(xué)院《混凝土結(jié)構(gòu)基本原理課程設(shè)計(jì)》2023-2024學(xué)年第一學(xué)期期末試卷
- 《新生兒窒息復(fù)蘇》PPT課件課件
- 漢語(yǔ)拼音四線格(空白)A4紙直接打印版
- 車身噴漆部件用量參考標(biāo)準(zhǔn)表
- 食品安全管理員任命書(shū)范文
- 完整版中華醫(yī)學(xué)會(huì)瘧疾診療規(guī)范
- 北師大版七年級(jí)生物上冊(cè)教案(全冊(cè)完整版)
- 防腐油漆施工工藝
- 南方S82T操作手冊(cè)
- 設(shè)備采購(gòu)安裝工程結(jié)算書(shū)
- [精品]臺(tái)灣地區(qū)零售藥店的現(xiàn)狀與發(fā)展趨勢(shì)
- 焙燒爐煙氣換熱器的設(shè)計(jì)方案
評(píng)論
0/150
提交評(píng)論