版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
..成績信息與通信工程學院實驗報告課程名稱:嵌入式系統(tǒng)原理與應(yīng)用實驗題目:多線程應(yīng)用程序設(shè)計指導教師:班級:學號:學生:實驗?zāi)康暮腿蝿?wù)掌握VI編譯環(huán)境。掌握GCC編譯命令。掌握多個文件共同編譯方法。掌握GDB調(diào)試命令。學習實驗設(shè)備實驗容及原理實驗步驟或程序流程Gcc編譯實驗編寫實驗代碼:圖3.1實驗主程序圖3.2實驗子程序編寫Makefile文件:圖3.3Makefile文件Make執(zhí)行Makefile文件,生成可執(zhí)行程序并運行:圖3.4執(zhí)行Gdb調(diào)試運行:圖3.5gdb調(diào)試顯示代碼圖3.6gdb調(diào)試斷點運行圖3.7gdb調(diào)試逐步運行多線程程序設(shè)計:對實驗代碼進展gcc編譯:圖3.7gcc編譯生成可執(zhí)行文件運行結(jié)果:圖3.8程序運行結(jié)果實驗數(shù)據(jù)及程序代碼Gcc編譯實驗:主程序:#include"stdio.h"#include"my2.h"intmain(){ printf("hello.Linuxworld.Iam1405014232zzm\n"); my2();}實驗子程序:#include"my2.h"#include"stdio.h"voidmy2(){ inti=1;floats=1 intN; printf("Pleaseinputn:\n"); scanf("%d",&N); for(i,i<=n,i++) s*=i; printf("result:"); printf("%f",s);}.h頭文件:#ifndef_MY2_H#define_MY2_Hintmain();voidmy2();#endifmakefile執(zhí)行文件:zzmgo:my2.omy1.o gcc-ozzmgomy2.omy1.omy1.o:my1.cmy2.h gcc-cmy1.cmy2.o:my2.cmy2.h gcc-cmy2.cclean:rm-rfmy1.omy2.ozzmgo多線程程序設(shè)計:..#include<stdio.h>#include<stdlib.h>#include<time.h>#include"pthread.h"#defineBUFFER_SIZE16/*Circularbufferofintegers.*/structprodcons{intbuffer[BUFFER_SIZE];/*theactualdata*/pthread_mutex_tlock;/*mutexensuringexclusiveaccesstobuffer*/intreadpos,writepos;/*positionsforreadingandwriting*/pthread_cond_tnotempty;/*signaledwhenbufferisnotempty*/pthread_cond_tnotfull;/*signaledwhenbufferisnotfull*/};/*--------------------------------------------------------*//*Initializeabuffer*/voidinit(structprodcons*b){pthread_mutex_init(&b->lock,NULL);pthread_cond_init(&b->notempty,NULL);pthread_cond_init(&b->notfull,NULL);b->readpos=0;b->writepos=0;}/*--------------------------------------------------------*//*Storeanintegerinthebuffer*/voidput(structprodcons*b,intdata){ pthread_mutex_lock(&b->lock); /*Waituntilbufferisnotfull*/ while((b->writepos+1)%BUFFER_SIZE==b->readpos){ printf("waitfornotfull\n"); pthread_cond_wait(&b->notfull,&b->lock); }/*Writethedataandadvancewritepointer*/ b->buffer[b->writepos]=data; b->writepos++; if(b->writepos>=BUFFER_SIZE)b->writepos=0;/*Signalthatthebufferisnownotempty*/ pthread_cond_signal(&b->notempty); pthread_mutex_unlock(&b->lock);}/*--------------------------------------------------------*//*Readandremoveanintegerfromthebuffer*/intget(structprodcons*b){ intdata; pthread_mutex_lock(&b->lock); /*Waituntilbufferisnotempty*/ while(b->writepos==b->readpos){ printf("waitfornotempty\n"); pthread_cond_wait(&b->notempty,&b->lock); } /*Readthedataandadvancereadpointer*/ data=b->buffer[b->readpos]; b->readpos++; if(b->readpos>=BUFFER_SIZE)b->readpos=0; /*Signalthatthebufferisnownotfull*/ pthread_cond_signal(&b->notfull); pthread_mutex_unlock(&b->lock); returndata;}/*--------------------------------------------------------*/#defineOVER(-1)structprodconsbuffer;/*--------------------------------------------------------*/void*producer(void*data){ intn; for(n=0;n<1000;n++){ printf("put-->%d\n",n); put(&buffer,n); }put(&buffer,OVER);printf("producerstopped!\n");returnNULL;}/*--------------------------------------------------------*/void*consumer(void*data){intd;while(1){d=get(&buffer);if(d==OVER)break;printf("%d-->get\n",d);}printf("consumerstopped!\n");returnNULL;}/*--------------------------------------------------------*/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);/*Waituntilproducerandconsumerfinish.*/ pthread_join(th_a,&retval); pthread_join(th_b,&retval); return0;}..實驗數(shù)據(jù)分析及處理實驗構(gòu)造流程圖:本實驗為著名的生產(chǎn)者-消費者問題模型的實現(xiàn),主程序中分別啟動生產(chǎn)者線程和消費者線程。生產(chǎn)者線程不斷順序地將0到1000的數(shù)字寫入共享的循環(huán)緩沖區(qū),同時消費者線程不斷地從共享的循環(huán)緩沖區(qū)讀取數(shù)據(jù)。流程圖如下圖:圖6.1生產(chǎn)者-消費者實驗源代碼構(gòu)造流程圖主要函數(shù)分析:下面我們來看一下,生產(chǎn)者寫入緩沖區(qū)和消費者從緩沖區(qū)讀數(shù)的具體流程,生產(chǎn)者首先要獲得互斥鎖,并且判斷寫指針+1后是否等于讀指針,如果相等那么進入等待狀態(tài),等候條件變量notfull;如果不等那么向緩沖區(qū)中寫一個整數(shù),并且設(shè)置條件變量為notempty,最后釋放互斥鎖。消費者線程與生產(chǎn)者線程類似,這里就不再過多介紹了。流程圖如下:圖6.2生產(chǎn)消費流程圖主要的多線程API:在本程序的代碼量的使用了線程函數(shù),如pthread_cond_signal、pthread_mutex_init、pthread_mutex_lock等等,這些函數(shù)的作用是什么,在哪里定義的,我們將在下面的容中為其中比擬重要的函數(shù)做一些詳細的說明。pthread_create線程創(chuàng)立函數(shù):intpthread_create(pthread_t*thread_id,__constpthread_attr_t*__attr,void*(*__start_routine)(void*),void*__restrict__arg)線程創(chuàng)立函數(shù)第一個參數(shù)為指向線程標識符的指針,第二個參數(shù)用來設(shè)置線程屬性,第三個參數(shù)是線程運行函數(shù)的起始地址,最后一個參數(shù)是運行函數(shù)的參數(shù)。這里,我們的函數(shù)thread不需要參數(shù),所以最后一個參數(shù)設(shè)為空指針。第二個參數(shù)我們也設(shè)為空指針,這樣將生成默認屬性的線程。當創(chuàng)立線程成功時,函數(shù)返回0,假設(shè)不為0那么說明創(chuàng)立線程失敗,常見的錯誤返回代碼為EAGAIN和EINVAL。前者表示系統(tǒng)限制創(chuàng)立新的線程,例如線程數(shù)目過多了;后者表示第二個參數(shù)代表的線程屬性值非法。創(chuàng)立線程成功后,新創(chuàng)立的線程那么運行參數(shù)三和參數(shù)四確定的函數(shù),原來的線程那么繼續(xù)運行下一行代碼。pthread_join函數(shù)用來等待一個線程的完畢。函數(shù)原型為:intpthread_join(pthread_t__th,void**__thread_return)第一個參數(shù)為被等待的線程標識符,第二個參數(shù)為一個用戶定義的指針,它可以用來存儲被等待線程的返回值。這個函數(shù)是一個線程阻塞的函數(shù),調(diào)用它的函數(shù)將一直等待到被等待的線程完畢為止,當函數(shù)返回時,被等待線程的資源被收回。pthread_exit函數(shù):一個線程的完畢有兩種途徑,一種是象我們上面的例子一樣,函數(shù)完畢了,調(diào)用它的線程也就完畢了;另一種方式是通過函數(shù)pthread_exit來實現(xiàn)。它的函數(shù)原型為:voidpthread_exit(void*__retval)唯一的參數(shù)是函數(shù)的返回代碼,只要pthread_join中的第二個參數(shù)thread_return不是NULL,這個值將被傳遞給thread_return。最后要說明的是,一個線程不能被多個線程等待,否那么第一個接收到信號的線程成功返回,其余調(diào)用pthread_join的線程那么返回錯誤代碼ESRCH。下面我們來介紹有關(guān)條件變量的容。使用互斥鎖來可實現(xiàn)線程間數(shù)據(jù)的共享和
溫馨提示
- 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. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年基礎(chǔ)教育校長任期目標責任聘用合同示范文本3篇
- 2025年廣東珠海市城市管理指揮中心招聘人員歷年高頻重點提升(共500題)附帶答案詳解
- 2024年精簡居間服務(wù)合同集3篇
- 2025年度民間借貸合同范本:醫(yī)療健康產(chǎn)業(yè)貸款合同范例2篇
- 分拆上市的動因及績效研究
- ESG表現(xiàn)、新質(zhì)生產(chǎn)力與企業(yè)高質(zhì)量發(fā)展
- 校本研修能力提升班開班儀式發(fā)言稿范文
- 云南省師大附中2021屆高三高考適應(yīng)性月考(五)文綜試題-掃描版含解析
- 數(shù)據(jù)通信技術(shù)論文
- 齒輪齒條傳動機構(gòu)設(shè)計說明書
- 長龍山抽水蓄能電站500kv開關(guān)站工程環(huán)境影響報告書
- 2023年中考語文一輪復(fù)習:童話示例與訓練
- 自助畫室創(chuàng)業(yè)計劃書
- 小學生心理問題的表現(xiàn)及應(yīng)對措施【全國一等獎】
- 生產(chǎn)車間薪酬管理制度
- 小學生科普人工智能
- 2022年北京外國語大學博士生英語入學考試試題
- 提高做好群眾工作的能力主講陶通艾
- 3500A 手持式綜合測試儀操作指導培訓
- GB/T 1335.2-2008服裝號型女子
- GB 31247-2014電纜及光纜燃燒性能分級
評論
0/150
提交評論