版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
實(shí)驗(yàn)七:Linux多線程編程(4課時(shí))實(shí)驗(yàn)?zāi)康模赫莆站€程的概念;熟悉Linux下線程程序編譯的過程;掌握多線程程序編寫方法。實(shí)驗(yàn)原理:為什么有了進(jìn)程的概念后,還要再引入線程呢?使用多線程到底有哪些好處?什么的系統(tǒng)應(yīng)當(dāng)選用多線程?我們一方面必須回答這些問題。1多線程概念使用多線程的理由之一是和進(jìn)程相比,它是一種非?!惫?jié)儉”的多任務(wù)操作方式。運(yùn)營(yíng)于一個(gè)進(jìn)程中的多個(gè)線程,它們彼此之間使用相同的地址空間,共享大部分?jǐn)?shù)據(jù),啟動(dòng)一個(gè)線程所花費(fèi)的空間遠(yuǎn)遠(yuǎn)小于啟動(dòng)一個(gè)進(jìn)程所花費(fèi)的空間。使用多線程的理由之二是線程間方便的通信機(jī)制。同一進(jìn)程下的線程之間共享數(shù)據(jù)空間,所以一個(gè)線程的數(shù)據(jù)可以直接為其它線程所用,這不僅快捷,并且方便。2多線程編程函數(shù)Linux系統(tǒng)下的多線程遵循POSIX線程接口,稱為pth「ead。編寫Linux下的多線程程序,需要使用頭文獻(xiàn)pthread.h,連接時(shí)需要使用庫(kù)Iibpthread.a。pthread」在頭文獻(xiàn)/usr/include/bits/pthreadtypes.h中定義:typedefunsignedlongintpthread_t;它是一個(gè)線程的標(biāo)記符。函數(shù)pthread_create用來(lái)創(chuàng)建一個(gè)線程,它的原型為:externintpthread_create((pthread_t*thread,constpthreadattrt*a11r,void*(*start_routine)(void*),void*arg));第一個(gè)參數(shù)為指向線程標(biāo)記符的指針,第二個(gè)參數(shù)用來(lái)設(shè)立線程屬性,第三個(gè)參數(shù)是線程運(yùn)營(yíng)函數(shù)的起始地址,最后一個(gè)參數(shù)是運(yùn)營(yíng)函數(shù)的參數(shù)。函數(shù)pth「ead_j。in用來(lái)等待一個(gè)線程的結(jié)束。函數(shù)原型為:externintpthread_join(pthread_tth,void**thread_rentmain(void)pthread_tthread:pthread_attr_tattr;intno=0,res:void*lhrd_ret;srand(time(NULL));/*初始化線程屬性對(duì)象*/res=pthread_attrjnit(&attr);if(res!=0)(printf("Createattributefailed\n");exit(res);)/*設(shè)立線程綁定屬性*/res=pthread_attr_setscope(&attr;PTHREAD_SC0PE_SYSTEM>;/*設(shè)立線程分離屬性*/res+=pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED);if(res!=0)(printf("Settingattributefailed\n");exit(res);>res=pthread_create(&thread,&attr.thrd_func,NULL);if(res!=0)printf("CreatethreadfaiIed\n");exit<res);}/*釋放線程屬性對(duì)象*/pthread_attr_destroy(&attr);printf("Createtreadsuccess\n"):whi1e(!finish_fIag)(Printf("Waitingforthreadtofinish...\n"):sleep(2);)return0;4、完畢教材上多線程實(shí)驗(yàn)的實(shí)驗(yàn)內(nèi)容。并分析程序的執(zhí)行結(jié)果。實(shí)驗(yàn)總結(jié):由運(yùn)營(yíng)結(jié)果可以看出,創(chuàng)建線程、釋放資源按照順序,而每個(gè)線程的運(yùn)營(yíng)和結(jié)束是獨(dú)立與并行的。turn);第一個(gè)參數(shù)為被等待的線程標(biāo)記符,第二個(gè)參數(shù)為一個(gè)用戶定義的指針,它可以用來(lái)存儲(chǔ)被等待線程的返回值。函數(shù)pthread_exit的函數(shù)原型為:externvoidpthread_exit(void*retval);唯一的參數(shù)是函數(shù)的返回代碼,只要pthread_join中的第二個(gè)參數(shù)thread_return不是NULL,這個(gè)值將被傳遞給thread_returno3修改線程的屬性線程屬性結(jié)構(gòu)為pthread_attr_t,它在頭文獻(xiàn)/usr/inc1ude/pthread.h中定義。屬性值不能直接設(shè)立,須使用相關(guān)函數(shù)進(jìn)行操作,初始化的函數(shù)為pthread_attr_init,這個(gè)函數(shù)必須在pthread_create函數(shù)之前調(diào)用。設(shè)立線程綁定狀態(tài)的函數(shù)為pthread_attr_setscope,它有兩個(gè)參數(shù),第一個(gè)是指向?qū)傩越Y(jié)構(gòu)的指針,第二個(gè)是綁定類型,它有兩個(gè)取值:PTHREAD_SCOPESYSTEM(綁定的)和PTHREAD_SCOPE.PROCESS(非綁定的)。此外一個(gè)也許常用的屬性是線程的優(yōu)先級(jí),它存放在結(jié)構(gòu)sched_param中。用函數(shù)Pthread_attr_getschedparam和函數(shù)pthread_attr_setschedparam進(jìn)行存放,一般說(shuō)來(lái),我們總是先取優(yōu)先級(jí),對(duì)取得的值修改后再存放回去。4線程的數(shù)據(jù)解決和進(jìn)程相比,線程的最大優(yōu)點(diǎn)之一是數(shù)據(jù)的共享性,各個(gè)進(jìn)程共享父進(jìn)程處沿襲的數(shù)據(jù)段,可以方便的獲得、修改數(shù)據(jù)。但這也給多線程編程帶來(lái)了許多問題。我們必須當(dāng)心有多個(gè)不同的進(jìn)程訪問相同的變量。許多函數(shù)是不可重入的,即同時(shí)不能運(yùn)營(yíng)一個(gè)函數(shù)的多個(gè)拷貝(除非使用不同的數(shù)據(jù)段)。在函數(shù)中聲明的靜態(tài)變量經(jīng)常帶來(lái)問題,函數(shù)的返回值也會(huì)有問題。互斥鎖互斥鎖用來(lái)保證一段時(shí)間內(nèi)只有一個(gè)線程在執(zhí)行一段代碼。必要性顯而易見:假設(shè)各個(gè)線程向同一個(gè)文獻(xiàn)順序?qū)懭霐?shù)據(jù),最后得到的結(jié)果一定是劫難性的。條件變量互斥鎖一個(gè)明顯的缺陷是它只有兩種狀態(tài):鎖定和非鎖定。而條件變量通過允許線程阻塞和等待另一個(gè)線程發(fā)送信號(hào)的方法填補(bǔ)了互斥鎖的局限性,它常和互斥鎖一起使用。使用時(shí),條件變量被用來(lái)阻塞一個(gè)線程,當(dāng)條件不滿足時(shí),線程往往解開相應(yīng)的互斥鎖并等待條件發(fā)生變化。信號(hào)量信號(hào)量既可以作為二值計(jì)數(shù)器(即0,1),也可以作為資源計(jì)數(shù)器.信號(hào)量本質(zhì)上是一個(gè)非負(fù)的整數(shù)計(jì)數(shù)器,它被用來(lái)控制對(duì)公共資源的訪問。當(dāng)公共資源增長(zhǎng)時(shí),調(diào)用函數(shù)sem_post()增長(zhǎng)信號(hào)量。只有當(dāng)信號(hào)量值大于。時(shí),才干使用公共資源,使用后,函數(shù)sem_wait()減少信號(hào)量。函數(shù)sem_trywait()和函數(shù)pthread_mutex_try1ock()起同樣的作用,它是函數(shù)sem_wait()的非阻塞版本。實(shí)驗(yàn)內(nèi)容:線程函數(shù)編譯時(shí)需要添加特殊編譯選項(xiàng):gcc火.c-Ipthread-o1、完畢教材上thread.c的例子,想一下每次執(zhí)行時(shí)結(jié)果相同嗎,為什么?答:每個(gè)線程的運(yùn)營(yíng)和結(jié)束時(shí)無(wú)序的、獨(dú)立與并行的。實(shí)驗(yàn)代碼:/*thread.c*/#include<stdio.h>#include<sIdlib.h>#include<pthread.h>#defineTHREAD_NUMBER3/*線程數(shù)*/#defineREPEAT_NUMBER5/*每個(gè)線程中的小任務(wù)數(shù)*/#defineDELaY_TIME_LEVELS6.0/*小任務(wù)之間的最大時(shí)間間隔*/void*thrd_func(void*arg)〃指針好亂,這里看不懂定義了什么,求解擇〃定義「一個(gè)返回值為指向空類型的指針的函數(shù),該函數(shù)的參數(shù)為一個(gè)指針(/*線程函數(shù)例程*/1ntthrd.num=(int)arg;//這個(gè)是賦值嗎?看不懂,求解釋//定義了一個(gè)整型參數(shù),取值為argintdelay_time=0;intcount=0;printf("Thread%disstarting\n",thrd_num);for(count=0;count<REPEAT_NUMBER;count++)《delay_time=(int)(rand()*DELAY_TIME_LEVELS/(RAND_MAX))+1;Printf('\tThread%d:job%ddeIay=%d\n",thrd_num,count,deIay_time);sleep(de1ay_time);〃暫停?秒//暫停隨機(jī)秒)//\t輸出一個(gè)Tab占8列〃輸出格式:Threadthrd_num:jobcountdelay=deIay_time【可車printf(MThread%dfinished\n",thrd_num):〃輸出格式:Threadthrd_numfinished回車pthread_exit(NULL);)intmain(void){pthread_tthread[THREAD_NUMBER]://定義了一個(gè)類型為Pthread」的數(shù)組,數(shù)組元素的個(gè)數(shù)為3intno=0,res;void*thrd_ret;//這句什么意思?求解釋〃定義了一個(gè)指針,指向哪里后面的程序里有。srand(time(NULL));〃這句什么意思?求解釋〃用系統(tǒng)時(shí)間計(jì)算一個(gè)隨機(jī)數(shù)。for(no=0;no<THREAD_NUMBER;no++){/*創(chuàng)建多線程*/res=pthread_create(&thread[no].NULL,thrd_func-(void*)no);//&thread[no]線程標(biāo)記符//pthread_create函數(shù)的參數(shù)含義請(qǐng)看書。if(res!=0)〃創(chuàng)建線程犯錯(cuò)時(shí)res=錯(cuò)誤碼(printf("Createthread%dfailed\n?,no);exit(res);//上面的不是退出進(jìn)程,而是判斷pthread_create()函數(shù)是否成功執(zhí)行。>)Printf("Createtreadssuccess\nWaitingforthreadstofinish...\n',):〃假如上面沒退出進(jìn)程,則創(chuàng)建線程成功for(no=0;no<THREAD_NUMBEK;no++){/*等待線程結(jié)束*/res=pthread_join(thread[no]r&thrd_ret>;//thread[no]線程標(biāo)記符,此例總共有thread[O],thread[l]fIhread[2],3個(gè)線程〃清看書上pthread_join()函數(shù)的參數(shù)含義.if(Ires)//res=OBb掛起線程成功〃res=0時(shí),說(shuō)明pthread_Join()函數(shù)執(zhí)行成功。printf("Thread%djoined\n",no);e1se(printf("Thread%djoinfailed\n",no);)}reiurn0:)2、完畢教材上thread_mutex.c例,查看運(yùn)營(yíng)情況。和上例比較有何不同,想一下為什么會(huì)出現(xiàn)這種差異?答:這里3個(gè)線程之間的運(yùn)營(yíng)順序跟創(chuàng)建線程的順序相同。include<stdio.h>include<std1ib.h>incIude<pthread.h>defineTHREAD_NUM3/*線程數(shù)*/#defineREPEAT_NUM3/*悠個(gè)線程的小任務(wù)數(shù)*/#defineDELAY_TIME_LEVELS6.0/*小任務(wù)之間的最大時(shí)間間隔*/pthread_mutex_tmutex;void*thrd_func(void*arg){intthrd_num=(int)arg;intdelay_time=0,count=0:intres:/*互斥鎖上鎖*/res=pthread_mutexJock(&mutex);if<res){printf("Thread%dlockfailed\n",thrd_num):pthrcad_exit(NULL);}printf("Thread%disstarting\n".thrd_num);for(count=0;Count<REPEAT_NUM:count++){delay_time=(int)(rand()*DELAY_TIME_LEVELS/(RAND.MAX))+1;sleep(deIay_timc);printf("\tThread%d:job%ddelay=%d\n",thrd_num,count,delay_time);)printf("Thread%dfinished\n"zthrd_num);pthread_mutex_unlock(&mutex);Pthread_exit(NULL);}intmain(void){pthread_tthread[THREAD_NUM];intno=0,res:void?thrd_ret;srand(time(NULL));/*互斥鎖初始化*/
pthrcad_mutex_init(&mutex,NULL);for(no=0;no<THREAD_NUM;no++){(void*)no);(void*)no);(void*)no);tofinish...\n");res=pthread_create(&thread[no],NULL,thrd_funif(res!=0)(void*)no);tofinish...\n");{printf("Createthread%dfaiIed\n",no);exit(res);})printf("Createtreadssuccess\nWaitingforthreadsfor(no=0;no<THREAD_NUM;no++){res=pthread_)oin(thread[no],&thrd_ret);if(!res){Printf("Thread%djoined\n".no):}eIse{oprintf("Thread%djoinfailed\n",no)
溫馨提示
- 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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024版樣機(jī)試制合作協(xié)議
- 2024年出租車租車合同模板
- 懷孕期間夫妻分手協(xié)議
- 城市軌道交通工程建筑信息模型(BIM)分類與編碼標(biāo)準(zhǔn)
- 建筑行業(yè)標(biāo)準(zhǔn)腳手架租賃合同
- 2024項(xiàng)目投資合同撰寫要點(diǎn)
- 購(gòu)買混凝土合同范本
- 生物中圖版自主訓(xùn)練:第三單元第一章第一節(jié)遺傳物質(zhì)的發(fā)現(xiàn)
- 簡(jiǎn)單的賠償協(xié)議書2024年
- 2024屆畢業(yè)生就業(yè)協(xié)議書樣本
- 2023年上海機(jī)場(chǎng)集團(tuán)有限公司校園招聘筆試題庫(kù)及答案解析
- 鏡頭的角度和方位課件
- 污水處理常用藥劑簡(jiǎn)介知識(shí)講解課件
- 五年級(jí)上冊(cè)英語(yǔ)課件-Unit 1《My future》第1課時(shí)牛津上海版(三起) (共28張PPT)
- 光交接箱施工規(guī)范方案
- 氣溫和降水學(xué)案
- 普及人民代表大會(huì)制度知識(shí)競(jìng)賽試題庫(kù)(1000題和答案)
- 國(guó)家電網(wǎng)公司施工項(xiàng)目部標(biāo)準(zhǔn)化管理手冊(cè)(2021年版)線路工程分冊(cè)
- 《汽車低壓線束設(shè)計(jì)規(guī)范》
- 工程項(xiàng)目增加簽證單
- 被一部電影感動(dòng)記韓國(guó)電影《鳴梁海戰(zhàn)》觀后感
評(píng)論
0/150
提交評(píng)論