




下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
LINUX下的多線程編程技術(shù)分析進程是程序執(zhí)行的動態(tài)過程,是系統(tǒng)分配軟硬件資源的最小單位。而線程是進程產(chǎn)生的分支,是更小的執(zhí)行實體,但系統(tǒng)并不給它分配任何資源,它共享創(chuàng)建它的進程所擁有的資源。同一進程內(nèi)的所有線程共享同一內(nèi)存地址空間,因而線程間的切換將不再需要資源信息的保存和進行地址空間的變換,減少了系統(tǒng)開銷。提高了系統(tǒng)效率和程序的并發(fā)性。在LINUX系統(tǒng)中也引入了線程的概念與多線程機制。1LINUX中的線程機制線程可分為用戶級線程和內(nèi)核級線程兩種基本類型。用戶級線程不需要內(nèi)核支持,可以在用戶程序中實現(xiàn),線程調(diào)度、同步與互斥都需要用戶程序自己完成。內(nèi)核級線程需要內(nèi)核參與,由內(nèi)核完成線程調(diào)度并提供相應(yīng)的系統(tǒng)調(diào)用,用戶程序可以通過這些接口函數(shù)對線程進行一定的控制和管理。Linux操作系統(tǒng)提供了LinuxThreads庫,在linuxthreads庫中提供了一些多線程編程的關(guān)鍵函數(shù),在多線程編程時應(yīng)包括pthread.h文件。2線程的創(chuàng)建和終止intpthread_create(pthread_t*pthread,constpthread_attr_t*attr,void*(*start_routine(*void)),void*arg):調(diào)用此函數(shù)可以創(chuàng)建一個新的線程,新線程創(chuàng)建后執(zhí)行start_routine指定的程序。其中參數(shù)attr是用戶希望創(chuàng)建線程的屬性,當為NULL時表示以默認的屬性創(chuàng)建線程。arg是向start_routine傳遞的參數(shù)。當成功創(chuàng)建一個新的線程時,系統(tǒng)會自動為新線程分配一個線程ID號,并通過pthread返回給調(diào)用者。voidpthread_exit(void*value_ptr):調(diào)用該函數(shù)可以退出線程,參數(shù)value_ptr是一個指向返回狀態(tài)值的指針。3線程控制函數(shù)Pthread_self(void):為了區(qū)分線程,在線程創(chuàng)建時系統(tǒng)為其分配一個唯一的ID號,由pthreadcreate()返回給調(diào)用者,也可以通過pthread_self()獲取自己的線程ID。Intpthread_join(pthread_tthread,void*status):這個函數(shù)的作用是等待一個線程的結(jié)束。調(diào)用pthread_join()的線程將被掛起直到線程ID為參數(shù)thread指定的線程終止。intpthread_detach(pthread_tpthread):參數(shù)pthread代表的線程一旦終止,立即釋放調(diào)該線程占有的所有資源。4線程間的互斥線程間的互斥是為了避免對臨界資源的同時使用,從而避免因此而產(chǎn)生的不可預(yù)料的后果。臨界資源是那些一次只能被一個線程使用的資源,如變量、鏈表、隊列等。互斥量和臨界區(qū)類似,只有擁有互斥量的線程才具有訪問資源的權(quán)限,由于互斥對象只有一個,這就決定了任何情況下共享資源(代碼或變量)都不會被多個線程同時訪問。使用互斥不僅能夠在同一應(yīng)用程序的不同線程中實現(xiàn)資源的安全共享,而且可以在不同應(yīng)用程序的線程之間實現(xiàn)對資源的安全共享。它可以保證對資源操作的正確性和完整性。由此可以看出線程間的互斥關(guān)系是由于對共有資源的競爭而產(chǎn)生的間接制約,線程之間并沒有直接的聯(lián)系。Linux中通過pthread_mutex_t來定義互斥體機制完成互斥操作。具體的操作函數(shù)如下:pthread_mutex_init(pthread_mutex_t*mutex,constpthread_mutexattr_t*attr):初使化一個互斥體變量mutex,參數(shù)attr表示按照attr屬性創(chuàng)建互斥體變量mutex,如果參數(shù)attr為NULL,則以默認的方式創(chuàng)建。Pthread_mutex_lock(pthread_mutex_t*mutex):給一個互斥體變量上鎖,如果mutex指定的互斥體已經(jīng)被鎖住,則調(diào)用線程將被阻塞直到擁有mutex的線程對mutex解鎖為止。Pthread_mutex_unlock(pthread_mutex_t*mutex):對參數(shù)mutex指定的互斥體變量解鎖。5線程間的同步線程間的同步是因為它們之間有相互的聯(lián)系,它們相互合作,相互等待,一個線程的執(zhí)行結(jié)果是另一個線程能夠執(zhí)行的前提條件。因而各線程必須被控制按一定的速度執(zhí)行,由此可看出線程間的同步關(guān)系由它們本身之間固有的聯(lián)系決定的,是相互直接制約的關(guān)系。實現(xiàn)線程間的互斥一般也可通過兩種途徑實現(xiàn)。是通過wait與signal過程在線程間互相發(fā)送消息來實現(xiàn)。主要有以下幾個函數(shù):Pthread_cond_t用于定義條件變量;Pthread_cond_init函數(shù)用于初始化一個條件變量;Pthread_cond_wait函數(shù)使線程阻塞在一個條件變量上,并同時可以解開互斥鎖,因此可以避免死鎖的產(chǎn)生;Pthread_cond_signal用來釋放被阻塞在條件變量cond上的一個線程;Pthread_cond_destroy函數(shù)用于釋放一個條件變量;流程為:其中"初值message1=true,message2=false。Wait的功能是判斷消息是否為真,若是繼續(xù)執(zhí)行,不是則等待;signal是將消息置為真,從而喚醒被阻塞的相應(yīng)線程。(2)是通過設(shè)置私用信號量。其中sem1是線程PA的私用信號量,sem2是線程PB的私用信號量,其初值根據(jù)具體資源情況而定,一般為一個正整數(shù),一個為零.私用信號量只能由其擁有者對其進行P操作,即線程只能由自己將自己阻塞,而不能由對方阻塞,但兩者可通過V操作彼此喚醒。6多線程編程的應(yīng)用實例下面通過創(chuàng)建兩個線程來實現(xiàn)對一個數(shù)的遞加。void*thread1(){printf("thread1:I'mthread1\n");for(i=0;i<5;i++){printf("thread1:number=%d\n",number);pthread_mutex_lock(&mu);number++;pthread_mutex_unlock(&mu);sleep(2);}pthread_exit(NULL);}void*thread2(){printf("thread2:I'mthread2\n");for(i=0;i<5;i++){printf("thread2:number=%d\n",number);pthread_mutex_lock(&mu);number++;pthread_mutex_unlock(&mu);sleep(3);}pthread_exit(NULL);}voidthread_create(void){inttemp;memset(&thread,0,sizeof(thread));/*創(chuàng)建線程*/if((temp=pthread_create(&thread[0],NULL,thread1,NULL))!=0)printf("線程1創(chuàng)建失敗!\n");elseprintf("線程1被創(chuàng)建\n");if((temp=pthread_create(&thread[1],NULL,thread2,NULL))!=0)printf("線程2創(chuàng)建失敗");elseprintf("線程2被創(chuàng)建\n");}voidthread_wait(void){/*等待線程結(jié)束*/if(thread[0]!=0) {pthread_join(thread[0],NULL);printf("線程1已經(jīng)結(jié)束\n");}if(thread[1]!=0) {pthread_join(thread[1],NULL);printf("線程2已經(jīng)結(jié)束\n");}}intmain(){/*用默認屬性初始化互斥鎖*/pthread_mutex_init(&mu,NULL);thread_create();thread_wait();return0;}該實例主要是說明兩個線程的互斥,在主函數(shù)中首先創(chuàng)建了thread[0],thread[0]中對全局變量number++,之后創(chuàng)建了thread[1],thread[1]同樣對全局變量number++,而且兩個線程在對number操作時都用了互斥鎖,所以在一個線程對number操作時另外一個線程會停在pthread_mutex_
溫馨提示
- 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)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025至2030年中國全自動繞簧機數(shù)據(jù)監(jiān)測研究報告
- 確定方向足球裁判員試題及答案
- 辦公新風(fēng)尚醫(yī)療器械智能化的應(yīng)用與展望
- 辦公衛(wèi)生中微生物學(xué)的實踐應(yīng)用研究
- 互聯(lián)網(wǎng)醫(yī)療與大數(shù)據(jù)技術(shù)的應(yīng)用
- 國企門面租賃合同協(xié)議
- 多項施工合同協(xié)議
- 國外技術(shù)指導(dǎo)合同協(xié)議
- 工程小型維修合同協(xié)議
- 奶茶店閉店合同協(xié)議
- 電子商務(wù)數(shù)據(jù)分析教學(xué)課件匯總完整版電子教案
- 浙江省公安民警心理測驗考試題目(含答案)
- (精品)3D打印機畢業(yè)論文
- 暖氣管道安裝施工方案(實用資料)
- 森林防火安全責(zé)任書(施工隊用)
- 自卸車液壓系統(tǒng)安裝手冊
- 裝載機 維護保養(yǎng)檢查記錄表
- CIE1964_CIE1931_標準照明體_1nm間隔
- (完整word版)建筑工程公司員工證書管理辦法
- Oring美國國家標準(AS568)
- 教育因愛幸福井曉輝
評論
0/150
提交評論