版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
實驗七:Linux多線程編程(4課時)實驗?zāi)康模赫莆站€程的概念;熟悉Linux下線程程序編譯的過程;掌握多線程程序編寫方法。實驗原理:為什么有了進(jìn)程的概念后,還要再引入線程呢?使用多線程到底有哪些好處?什么的系統(tǒng)應(yīng)當(dāng)選用多線程?我們一方面必須回答這些問題。1多線程概念使用多線程的理由之一是和進(jìn)程相比,它是一種非常”節(jié)儉”的多任務(wù)操作方式。運營于一個進(jìn)程中的多個線程,它們彼此之間使用相同的地址空間,共享大部分?jǐn)?shù)據(jù),啟動一個線程所花費的空間遠(yuǎn)遠(yuǎn)小于啟動一個進(jìn)程所花費的空間。使用多線程的理由之二是線程間方便的通信機(jī)制。同一進(jìn)程下的線程之間共享數(shù)據(jù)空間,所以一個線程的數(shù)據(jù)可以直接為其它線程所用,這不僅快捷,并且方便。2多線程編程函數(shù)Linux系統(tǒng)下的多線程遵循POSIX線程接口,稱為pth「ead。編寫Linux下的多線程程序,需要使用頭文獻(xiàn)pthread.h,連接時需要使用庫Iibpthread.a。pthread」在頭文獻(xiàn)/usr/include/bits/pthreadtypes.h中定義:typedefunsignedlongintpthread_t;它是一個線程的標(biāo)記符。函數(shù)pthread_create用來創(chuàng)建一個線程,它的原型為:externintpthread_create((pthread_t*thread,constpthreadattrt*a11r,void*(*start_routine)(void*),void*arg));第一個參數(shù)為指向線程標(biāo)記符的指針,第二個參數(shù)用來設(shè)立線程屬性,第三個參數(shù)是線程運營函數(shù)的起始地址,最后一個參數(shù)是運營函數(shù)的參數(shù)。函數(shù)pth「ead_j。in用來等待一個線程的結(jié)束。函數(shù)原型為:externintpthread_join(pthread_tth,void**thread_rentmain(void)pthread_tthread:pthread_attr_tattr;intno=0,res:void*lhrd_ret;srand(time(NULL));/*初始化線程屬性對象*/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);}/*釋放線程屬性對象*/pthread_attr_destroy(&attr);printf("Createtreadsuccess\n"):whi1e(!finish_fIag)(Printf("Waitingforthreadtofinish...\n"):sleep(2);)return0;4、完畢教材上多線程實驗的實驗內(nèi)容。并分析程序的執(zhí)行結(jié)果。實驗總結(jié):由運營結(jié)果可以看出,創(chuàng)建線程、釋放資源按照順序,而每個線程的運營和結(jié)束是獨立與并行的。turn);第一個參數(shù)為被等待的線程標(biāo)記符,第二個參數(shù)為一個用戶定義的指針,它可以用來存儲被等待線程的返回值。函數(shù)pthread_exit的函數(shù)原型為:externvoidpthread_exit(void*retval);唯一的參數(shù)是函數(shù)的返回代碼,只要pthread_join中的第二個參數(shù)thread_return不是NULL,這個值將被傳遞給thread_returno3修改線程的屬性線程屬性結(jié)構(gòu)為pthread_attr_t,它在頭文獻(xiàn)/usr/inc1ude/pthread.h中定義。屬性值不能直接設(shè)立,須使用相關(guān)函數(shù)進(jìn)行操作,初始化的函數(shù)為pthread_attr_init,這個函數(shù)必須在pthread_create函數(shù)之前調(diào)用。設(shè)立線程綁定狀態(tài)的函數(shù)為pthread_attr_setscope,它有兩個參數(shù),第一個是指向?qū)傩越Y(jié)構(gòu)的指針,第二個是綁定類型,它有兩個取值:PTHREAD_SCOPESYSTEM(綁定的)和PTHREAD_SCOPE.PROCESS(非綁定的)。此外一個也許常用的屬性是線程的優(yōu)先級,它存放在結(jié)構(gòu)sched_param中。用函數(shù)Pthread_attr_getschedparam和函數(shù)pthread_attr_setschedparam進(jìn)行存放,一般說來,我們總是先取優(yōu)先級,對取得的值修改后再存放回去。4線程的數(shù)據(jù)解決和進(jìn)程相比,線程的最大優(yōu)點之一是數(shù)據(jù)的共享性,各個進(jìn)程共享父進(jìn)程處沿襲的數(shù)據(jù)段,可以方便的獲得、修改數(shù)據(jù)。但這也給多線程編程帶來了許多問題。我們必須當(dāng)心有多個不同的進(jìn)程訪問相同的變量。許多函數(shù)是不可重入的,即同時不能運營一個函數(shù)的多個拷貝(除非使用不同的數(shù)據(jù)段)。在函數(shù)中聲明的靜態(tài)變量經(jīng)常帶來問題,函數(shù)的返回值也會有問題?;コ怄i互斥鎖用來保證一段時間內(nèi)只有一個線程在執(zhí)行一段代碼。必要性顯而易見:假設(shè)各個線程向同一個文獻(xiàn)順序?qū)懭霐?shù)據(jù),最后得到的結(jié)果一定是劫難性的。條件變量互斥鎖一個明顯的缺陷是它只有兩種狀態(tài):鎖定和非鎖定。而條件變量通過允許線程阻塞和等待另一個線程發(fā)送信號的方法填補(bǔ)了互斥鎖的局限性,它常和互斥鎖一起使用。使用時,條件變量被用來阻塞一個線程,當(dāng)條件不滿足時,線程往往解開相應(yīng)的互斥鎖并等待條件發(fā)生變化。信號量信號量既可以作為二值計數(shù)器(即0,1),也可以作為資源計數(shù)器.信號量本質(zhì)上是一個非負(fù)的整數(shù)計數(shù)器,它被用來控制對公共資源的訪問。當(dāng)公共資源增長時,調(diào)用函數(shù)sem_post()增長信號量。只有當(dāng)信號量值大于。時,才干使用公共資源,使用后,函數(shù)sem_wait()減少信號量。函數(shù)sem_trywait()和函數(shù)pthread_mutex_try1ock()起同樣的作用,它是函數(shù)sem_wait()的非阻塞版本。實驗內(nèi)容:線程函數(shù)編譯時需要添加特殊編譯選項:gcc火.c-Ipthread-o1、完畢教材上thread.c的例子,想一下每次執(zhí)行時結(jié)果相同嗎,為什么?答:每個線程的運營和結(jié)束時無序的、獨立與并行的。實驗代碼:/*thread.c*/#include<stdio.h>#include<sIdlib.h>#include<pthread.h>#defineTHREAD_NUMBER3/*線程數(shù)*/#defineREPEAT_NUMBER5/*每個線程中的小任務(wù)數(shù)*/#defineDELaY_TIME_LEVELS6.0/*小任務(wù)之間的最大時間間隔*/void*thrd_func(void*arg)〃指針好亂,這里看不懂定義了什么,求解擇〃定義「一個返回值為指向空類型的指針的函數(shù),該函數(shù)的參數(shù)為一個指針(/*線程函數(shù)例程*/1ntthrd.num=(int)arg;//這個是賦值嗎?看不懂,求解釋//定義了一個整型參數(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輸出一個Tab占8列〃輸出格式:Threadthrd_num:jobcountdelay=deIay_time【可車printf(MThread%dfinished\n",thrd_num):〃輸出格式:Threadthrd_numfinished回車pthread_exit(NULL);)intmain(void){pthread_tthread[THREAD_NUMBER]://定義了一個類型為Pthread」的數(shù)組,數(shù)組元素的個數(shù)為3intno=0,res;void*thrd_ret;//這句什么意思?求解釋〃定義了一個指針,指向哪里后面的程序里有。srand(time(NULL));〃這句什么意思?求解釋〃用系統(tǒng)時間計算一個隨機(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ù)含義請看書。if(res!=0)〃創(chuàng)建線程犯錯時res=錯誤碼(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個線程〃清看書上pthread_join()函數(shù)的參數(shù)含義.if(Ires)//res=OBb掛起線程成功〃res=0時,說明pthread_Join()函數(shù)執(zhí)行成功。printf("Thread%djoined\n",no);e1se(printf("Thread%djoinfailed\n",no);)}reiurn0:)2、完畢教材上thread_mutex.c例,查看運營情況。和上例比較有何不同,想一下為什么會出現(xiàn)這種差異?答:這里3個線程之間的運營順序跟創(chuàng)建線程的順序相同。include<stdio.h>include<std1ib.h>incIude<pthread.h>defineTHREAD_NUM3/*線程數(shù)*/#defineREPEAT_NUM3/*悠個線程的小任務(wù)數(shù)*/#defineDELAY_TIME_LEVELS6.0/*小任務(wù)之間的最大時間間隔*/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. 本站所有資源如無特殊說明,都需要本地電腦安裝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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 國際商務(wù)管理試題及答案
- 2026 年中職景區(qū)服務(wù)與管理(景區(qū)服務(wù)基礎(chǔ))試題及答案
- 辦公樓租賃終止合同協(xié)議2025年
- 辦公家具采購合同協(xié)議(人體工學(xué))2025
- 多模態(tài)同源數(shù)據(jù)分析框架
- 2025年河北省公需課學(xué)習(xí)-定制式醫(yī)療器械監(jiān)督管理規(guī)定
- 2025年預(yù)防艾滋病知識競賽試題及答案
- 體育游戲舞龍真題及答案
- 道路交通安全(第2版)課件匯 李銳 1-1:道路交通安全課程導(dǎo)入 -5-2:交通環(huán)境影響下交通安全分析
- 惠州小學(xué)綜合科試卷及答案
- 海上風(fēng)電場項目陸上集控中心環(huán)評報告公示
- 老舊小區(qū)消防系統(tǒng)升級改造方案
- 起重機(jī)械應(yīng)急救援預(yù)案演練記錄
- 新專業(yè)申報答辯課件
- 護(hù)理事業(yè)十五五發(fā)展規(guī)劃(2026-2030年)
- 關(guān)于酒店掛賬管理辦法
- DBJ50-T-200-2024 建筑樁基礎(chǔ)技術(shù)標(biāo)準(zhǔn)
- 教科版科學(xué)小學(xué)五年級上冊《機(jī)械擺鐘》教學(xué)設(shè)計
- 學(xué)校旱地龍舟賽活動方案
- 2025年北京第一次高中學(xué)業(yè)水平合格考數(shù)學(xué)試卷真題(含答案詳解)
- 2025年陜西省中考英語試題卷(含答案)
評論
0/150
提交評論