


版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
1、實驗二-多線程應用程序設計成績信息與通信工程學院實驗報告課程名稱:嵌入式系統(tǒng)原理與應用實驗題目:多線程應用程序設計指導教師:班級:學號:學生姓名:一、實驗目的和任務1. 掌握VI編譯環(huán)境。2. 掌握GCC®譯命令。3. 掌握多個文件共同編譯方法。4. 掌握GDESM試命令。5. 了解多線程程序設計的基本原理。6. 學習pthread庫函數(shù)的使用。二、實驗設備7. 硬件:PC機軟件:LINUX操作系統(tǒng)、虛擬機三、實驗內(nèi)容及原理1. 在VI編輯器里編寫兩個文件(其中一個為主程序,實現(xiàn)顯示“hello,linuxworldIam1405014XXXXXX,一個為子程序,實現(xiàn)1n的乘法),為
2、其書寫頭文件,共同編譯為可執(zhí)行文件,執(zhí)行,觀察運行結(jié)果。學習書寫MAKEFILES件,編譯,執(zhí)行,觀察結(jié)果。利用GCC編譯(加參數(shù)-g)為可執(zhí)行文件,利用GD酬試,學習GD酬試命令。編寫多線程程序設計。編譯并運行,觀察結(jié)果。(可參照課件或?qū)嶒炛笇┧?、實驗步驟或程序流程1.Gcc編譯實驗1)編寫實驗代碼:tW煽蜘曲曾看也爵扣轉(zhuǎn)到僉fin-clwde*sldio-h"litdeintimn()prinlf('he11o.Linux5M,Iam141IS<)I452um):ny3(>:圖3.1實驗主程序文件上畸如華a«j(v)終燦工wmg>幫叫jud
3、1include$20winrludere1Jio-h*、iidn»2()«mtE;floaI$!:men:prmlfTPleasevnpuEr;n');i:i<=n;i+)Ef.Iprmlf'*resu11z.nB);prmlft圖3.2實驗子程序2)編寫Makefile文件:圖3.3Makefile文件3)Make執(zhí)行Makefile文件,生成可執(zhí)行程序并運行:ranItiuiilrcof#ycc-cin2*cgcc-civyl*cgeef:7rrgcrry2.<jmyl.rouIluedLliutLrciul樣iwkefiIfrryI.cn
4、yITQQIJtlQSIr<JQ<1#tieIla.Linu颶rIdIPlejseinpuLn:Jresult:1.OOOOOOFruoi1locaIhasttry2.cChmr2o./IIllgoam1405014232IF4X)11#viia2.csyj;LerminI.Lx.l圖3.4執(zhí)行4)Gdb調(diào)試運行:roullucjLhoslromtrrukocLeanrm-rf.dnyN.ozztioroollocaIhgLrmkefiIenyl*trooilocaLhosL(rou倔IuudLlicslnukefilenyJroovlocaLhost<MJgdb必dhitr
5、ootifrry2,croot#rgt#tv2crootffsysterminfoHx1iy1*cny2*czziioiiw2.hpdhiznosysLeritulife.txt.zer;Linux(S3posi-D.20021129.l£rh)Gopyright2003FreeSofFoundu1iontInc.(.USi<freesuftuxire»coveredbylhE(NU(nraI?ub1icLir由he,andyouarewIcoireiuchunye11and/ordisLiibutecaplesoIilundercctamcondi11ujis.Ty
6、peT5howcopying*toseelheccndi1ionsPThereisabsoluteynowtrranlyforType'showarranly'fordelaih.This<niiconfinuredds'i3H6-rcdhai-LinK-gnu'.(gdb)II2tfincludeTstdio.h'includeTny2h145srgprintf(¥heIlo-Linuxny2();Id,Iam14051)14232zzmXn);圖3.5gdb調(diào)試顯示代碼i'<>:Jl.i.'tucdllmN
7、文件遂)帽料恒)§e(y抖端侄_掛到(幫助(H)9I(gdh)bfiBjcukp-Dini1ut0x&Q4835sfiknyl,*c,Iinc研fgdbrbtarIipi'ram:/1ooL/znoBreakpoinit11Train(>atnyl+c:66 (gdbsnsin)atrry.c:77 prinif(TheJ1«Xinu3<world.Iam1+05()14232n*);(gdb)she1Id.LinuM曲Id.IjmUOS0142322?.m8 try2(>(gdb)號ny2)丑Iirir2*c;55 inii*j(gdb)
8、s£floaI=1x(gdb)¥6 priniT('PleaseinpulfiZtT);(gdb)iPleaseinpuimflscarif("版;圖3.6gdb調(diào)試斷點運行6fqtE;(gdbsRprinif("I'lea5einputn:rT);(gdb)&t*leasemputn:9 scanfCM*tin:(gdb)is10 for(i;i<=nji+丑)(gdb)s11 s*-ii(gdb)g10 forJiji<=ni+)(gdt)s11 5=i;(gdb)s10far(i;i<=n;it+)(gdb
9、)qTheprogramisrunning.KxitJnyymy/*yorji)yjrooilQcaIhostroatlfl|V圖3.7gdb調(diào)試逐步運行2.1)2)多線程程序設計:對實驗代碼進行g(shù)cc編譯:uIlMAt/Arjn£11也.垢fif認義均瑜B據(jù)虹01roallIonIhoctM/-irrrt?*IIOft/ri-/b3Br/02juhmriIroQl?-l(iialhcst02pdirrid)I»Mkff1IW禎,c1fddIHaciIhoit02jstlirrid3gcc'c1root>Inea1hottQ2jstlire*.#I&M
10、ke(iIfpihrei-d,ai1rgU時IIW"92ptlirejdl?黑p/utr/hin/Id:eiiuMifind-Ipihreirollee12:Idrelurnrdkcmvt&laiusIroot-lv«Ibott01_ptlirrjiil)Sgre"t>/uif/bin/Id:eiiwiIfind-Iplhredci>lkc12;IdrelurprdkcmpI*1卬呂l|roqI:<IociIhott02_ptlirejill)£?c-o1roDl1laci1hott02_ptlhrejiil)置I«M
11、iIsff:ilrpilirrod<rpihread.uIrddidofilh<jkt02J3tlirejillfpttimd.cpthrrid.o-Ipthredpthread.q-Ipthredpthreftd.o-Ipthread圖3.7gcc編譯生成可執(zhí)行文件運行結(jié)果:WHGeIlSKH->UPI洲"i590->ge1明I->gcI地a】Itarnoieuptyput>琪非4puI->1SpuI>5»9I>pul>97pUl->.fVLpuI-沖財producer$9知X(jriU94et£
12、)95->ppt096-l997->uei9JH宜i洲H沖iponsujirriiwpprdJF4OttfloC'BIhoi|ny)N圖3.8程序運行結(jié)果五、1.1)實驗數(shù)據(jù)及程序代碼Gcc編譯實驗:主程序:#include"stdio.h"#include"my2.h"intmain()printf("hello.Linuxworld.Iam1405014232zzmn");my2();2)實驗子程序:#include"my2.h"#include"stdio.h"void
13、my2()(inti=1;floats=1intN;printf("Pleaseinputn:n");scanf("%d",&N);for(i,i<=n,i+)s*=i;printf("result:");printf("%f",s);3).h頭文件:#ifndef_MY2_H#define_MY2_Hintmain();voidmy2();#endif4)makefile執(zhí)行文件:zzmgo:my2.omy1.ogcc-ozzmgomy2.omy1.omy1.o:my1.cmy2.hgcc-cmy1
14、.cmy2.o:my2.cmy2.hgcc-cmy2.cclean:rm-rfmy1.omy2.ozzmgo多線程程序設計:#include<stdio.h>bufferBUFFER_SIZE#include/*theactualdata:stdlib.h>*/#include<time.h>pthread_mutex_#includelock;pthread.h"/*mutexensur#defineexclusiveaccessbuffer*/3UFFER_SIZE16intreadp/*Circularbufferwritepos;/*positi
15、ons1.fortingtoofintegers.*/structprodcons(readingandwriting*/pthread_cond_tintnotempty;/*signaledwhen>notempty,NULL);bufferisnotempty*/pthread_cond_tpthread_cond_init(&b-notfull;/*signaledwhenbufferisnotfull*/;/*>notfull,NULL);b->readpos=0;b->writepos=0;/*ct*/*Initializeabuffer*/void
16、init(structprodcons*b)(/*Storeanintegerinthebuffer*/voidput(struprodcons*b,intdata)(pthread_mutex_lock(&b->lock);/*Waituntilpthread_mutex_init(&b->lock,NULL);pthread_cond_init(&b-bufferisnotfull*/while(b->writepos+1)%empty*/BUFFER_SIZE=b->readpos)pthread_cond_signal(printf(&q
17、uot;waitfornotfulln");&b->notempty);pthread_cond_wait(&b->notfull,&b->lock);/*Writethedatapthread_mutex_unlock(&b->lock);/*andadvancewritepointer*/*Readandremoveb->bufferb->writepos=data;b->writepos+;ifanintegerfrombuffer*/intthect(b->writeposBUFFER_SIZE)
18、b->writepos=0;>=get(struprodcons*b)intdata;pthread_mutex_loc/*Signalthatk(&b->lock);thebufferisnownot/*Waituntil/*Signalthatfull*/bufferisnotempty*/thebufferisnownotwhile(b->writeposb->readpos)printf("waitfornotemptyn");pthread_cond_signal(&b->notfull);pthread_con
19、d_wait(&b->notempty,&b->lock);/*Readthedataandadvancereadpthread_mutex_unlock(&b->lock);returndata;/*pointer*/datab->bufferb->readposJb->readpos+;if(b->readpos>=*/#defineOVER(-1)structprodconsbuffer;/*BUFFER_SIZE)b->readpos=0;/voidproducer(void*data)void(intn;f
20、or(n=0;n<000;n+)(printf("put->%dn",n);put(&buffer,consumer(void*data)(intd;while(1)(dget(&buffer);if(d=OVEF)break;n);put(&buffer,OVER);printf("producerstopped!n");returnNULL;/*printf("%d->getn",d);printf("consumerstopped!n");returnNULL;/*/
21、intmain(void)(pthread_tth_a,th_b;void*retval;init(&buffer);pthread_create(&th_a,NULL,producer,0);pthread_create(&th_b,NULL,consumer,0);/*Waituntil六、實驗數(shù)據(jù)分析及處理1.實驗結(jié)構(gòu)流程圖:producerandconsumerfinish.*/pthread_join(th_a,&retval);pthread_join(th_b,&retval);return0;本實驗為著名的生產(chǎn)者一消費者問題模型的實現(xiàn),主
22、程序中分別啟動生產(chǎn)者線程和消費者線程。生產(chǎn)者線程不斷順序地將0到1000的數(shù)字寫入共享的循環(huán)緩沖區(qū),同時消費者線程不斷地從共享的循環(huán)緩沖區(qū)讀取數(shù)據(jù)。流程圖如圖所示:圖6.1生產(chǎn)者-消費者實驗源代碼結(jié)構(gòu)流程圖2.主要函數(shù)分析:卜面我們來看一下,生產(chǎn)者寫入緩沖區(qū)和消費者從緩沖區(qū)讀數(shù)的具體流程,生產(chǎn)者首先要獲得互斥鎖,并且判斷寫指針+1后是否等丁讀指針,如果相等則進入等待狀態(tài),等候條件變量notfull;如果不等則向緩沖區(qū)中寫一個整數(shù),并且設置條件變量為notempty,最后釋放互斥鎖。消費者線程與生產(chǎn)者線程類似,這里就不再過多介紹了。流程圖如下:避行生產(chǎn)Nt)3.圖6.2生產(chǎn)消費流程圖主要的多線程
23、API:在本程序的代碼中大量的使用了線程函數(shù),如pthread_cond_signal定義pthread_mutex_init、pthread_mutex_lock等等,這些函數(shù)的作用是什么,在哪里1)pthread_create線程創(chuàng)建函數(shù):,我們將在下面的內(nèi)容中為其中比較重要的函數(shù)做一些詳細的說明。_attr,intpthread_create(pthread_t*thread_id,_constpthread_attr_t*void*(*_start_routine)(void*),void*_irestrict_arg)線程創(chuàng)建函數(shù)第一個參數(shù)為指向線程標識符的指針,第二個參數(shù)用來設置線程屆性,第三個參數(shù)是線程運行函數(shù)的起始地址,最后一個參數(shù)是運行函數(shù)的參數(shù)。這里,我們的函數(shù)thread不需要參數(shù),所以最后一個參數(shù)設為空指針。第二個參數(shù)我們也設為空指針,這樣將生成默認屆性的線程。當創(chuàng)建線程成功時,函數(shù)返回0,若不為0則說明創(chuàng)建線程失敗,常見的錯誤返回代碼為EAGAIN和EINVAL。前者表示系統(tǒng)限制創(chuàng)建新的線程,例如線程數(shù)目過多了;后者表示第二個參數(shù)代表的線程屆性值非法。創(chuàng)建線程成功后,新創(chuàng)建的線程則運行參數(shù)三和參數(shù)四確定的函數(shù),原來的線程則
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 人工拋石施工方案
- 高考化學備考浙江選考測試題單元滾動檢測卷(十一)
- 高中化學化學反應原理學案112焓變熱化學方程式
- 2017-2018學年高中化學必修2時訓練第三章有機化合物檢測試題
- 25學年教案語文(必修上冊)第四單元“家鄉(xiāng)文化生活”活動手冊
- 第30課++系統(tǒng)安全需升級+教學設計-+2024-2025學年人教版(2024)初中信息科技八年級全一冊
- 烏魯木齊房產(chǎn)轉(zhuǎn)讓合同范例
- 中介介紹分紅合同范例
- 供用沙合同范例
- 加裝電梯銷售合同范例
- 小學高年級《紅樓春趣》劇本(寧波實驗學校)
- 安徽省縣域?qū)W前教育普及普惠督導評估指標體系
- 第二章-英國學前教育
- 國家職業(yè)技能鑒定考試-高級機修鉗工題庫
- 315國際消費者權(quán)益保護日知識講座課件
- 2023年二手房買賣合同正式版
- 2例不良事件根因分析
- YS/T 269-2008丁基鈉(鉀)黃藥
- GB/T 3808-2018擺錘式?jīng)_擊試驗機的檢驗
- (完整版)《汽車材料》課程標準
- GB 1523-2013綿羊毛
評論
0/150
提交評論