LINUX下的多線程編程技術(shù)分析_第1頁
LINUX下的多線程編程技術(shù)分析_第2頁
LINUX下的多線程編程技術(shù)分析_第3頁
LINUX下的多線程編程技術(shù)分析_第4頁
LINUX下的多線程編程技術(shù)分析_第5頁
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

LINUX下的多線程編程技術(shù)分析進(jìn)程是程序執(zhí)行的動(dòng)態(tài)過程,是系統(tǒng)分配軟硬件資源的最小單位。而線程是進(jìn)程產(chǎn)生的分支,是更小的執(zhí)行實(shí)體,但系統(tǒng)并不給它分配任何資源,它共享創(chuàng)建它的進(jìn)程所擁有的資源。同一進(jìn)程內(nèi)的所有線程共享同一內(nèi)存地址空間,因而線程間的切換將不再需要資源信息的保存和進(jìn)行地址空間的變換,減少了系統(tǒng)開銷。提高了系統(tǒng)效率和程序的并發(fā)性。在LINUX系統(tǒng)中也引入了線程的概念與多線程機(jī)制。1LINUX中的線程機(jī)制線程可分為用戶級線程和內(nèi)核級線程兩種基本類型。用戶級線程不需要內(nèi)核支持,可以在用戶程序中實(shí)現(xiàn),線程調(diào)度、同步與互斥都需要用戶程序自己完成。內(nèi)核級線程需要內(nèi)核參與,由內(nèi)核完成線程調(diào)度并提供相應(yīng)的系統(tǒng)調(diào)用,用戶程序可以通過這些接口函數(shù)對線程進(jìn)行一定的控制和管理。Linux操作系統(tǒng)提供了LinuxThreads庫,在linuxthreads庫中提供了一些多線程編程的關(guān)鍵函數(shù),在多線程編程時(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)建一個(gè)新的線程,新線程創(chuàng)建后執(zhí)行start_routine指定的程序。其中參數(shù)attr是用戶希望創(chuàng)建線程的屬性,當(dāng)為NULL時(shí)表示以默認(rèn)的屬性創(chuàng)建線程。arg是向start_routine傳遞的參數(shù)。當(dāng)成功創(chuàng)建一個(gè)新的線程時(shí),系統(tǒng)會(huì)自動(dòng)為新線程分配一個(gè)線程ID號,并通過pthread返回給調(diào)用者。voidpthread_exit(void*value_ptr):調(diào)用該函數(shù)可以退出線程,參數(shù)value_ptr是一個(gè)指向返回狀態(tài)值的指針。3線程控制函數(shù)Pthread_self(void):為了區(qū)分線程,在線程創(chuàng)建時(shí)系統(tǒng)為其分配一個(gè)唯一的ID號,由pthreadcreate()返回給調(diào)用者,也可以通過pthread_self()獲取自己的線程ID。Intpthread_join(pthread_tthread,void*status):這個(gè)函數(shù)的作用是等待一個(gè)線程的結(jié)束。調(diào)用pthread_join()的線程將被掛起直到線程ID為參數(shù)thread指定的線程終止。intpthread_detach(pthread_tpthread):參數(shù)pthread代表的線程一旦終止,立即釋放調(diào)該線程占有的所有資源。4線程間的互斥線程間的互斥是為了避免對臨界資源的同時(shí)使用,從而避免因此而產(chǎn)生的不可預(yù)料的后果。臨界資源是那些一次只能被一個(gè)線程使用的資源,如變量、鏈表、隊(duì)列等?;コ饬亢团R界區(qū)類似,只有擁有互斥量的線程才具有訪問資源的權(quán)限,由于互斥對象只有一個(gè),這就決定了任何情況下共享資源(代碼或變量)都不會(huì)被多個(gè)線程同時(shí)訪問。使用互斥不僅能夠在同一應(yīng)用程序的不同線程中實(shí)現(xiàn)資源的安全共享,而且可以在不同應(yīng)用程序的線程之間實(shí)現(xiàn)對資源的安全共享。它可以保證對資源操作的正確性和完整性。由此可以看出線程間的互斥關(guān)系是由于對共有資源的競爭而產(chǎn)生的間接制約,線程之間并沒有直接的聯(lián)系。Linux中通過pthread_mutex_t來定義互斥體機(jī)制完成互斥操作。具體的操作函數(shù)如下:pthread_mutex_init(pthread_mutex_t*mutex,constpthread_mutexattr_t*attr):初使化一個(gè)互斥體變量mutex,參數(shù)attr表示按照attr屬性創(chuàng)建互斥體變量mutex,如果參數(shù)attr為NULL,則以默認(rèn)的方式創(chuàng)建。Pthread_mutex_lock(pthread_mutex_t*mutex):給一個(gè)互斥體變量上鎖,如果mutex指定的互斥體已經(jīng)被鎖住,則調(diào)用線程將被阻塞直到擁有mutex的線程對mutex解鎖為止。Pthread_mutex_unlock(pthread_mutex_t*mutex):對參數(shù)mutex指定的互斥體變量解鎖。5線程間的同步線程間的同步是因?yàn)樗鼈冎g有相互的聯(lián)系,它們相互合作,相互等待,一個(gè)線程的執(zhí)行結(jié)果是另一個(gè)線程能夠執(zhí)行的前提條件。因而各線程必須被控制按一定的速度執(zhí)行,由此可看出線程間的同步關(guān)系由它們本身之間固有的聯(lián)系決定的,是相互直接制約的關(guān)系。實(shí)現(xiàn)線程間的互斥一般也可通過兩種途徑實(shí)現(xiàn)。是通過wait與signal過程在線程間互相發(fā)送消息來實(shí)現(xiàn)。主要有以下幾個(gè)函數(shù):Pthread_cond_t用于定義條件變量;Pthread_cond_init函數(shù)用于初始化一個(gè)條件變量;Pthread_cond_wait函數(shù)使線程阻塞在一個(gè)條件變量上,并同時(shí)可以解開互斥鎖,因此可以避免死鎖的產(chǎn)生;Pthread_cond_signal用來釋放被阻塞在條件變量cond上的一個(gè)線程;Pthread_cond_destroy函數(shù)用于釋放一個(gè)條件變量;流程為:其中"初值message1=true,message2=false。Wait的功能是判斷消息是否為真,若是繼續(xù)執(zhí)行,不是則等待;signal是將消息置為真,從而喚醒被阻塞的相應(yīng)線程。(2)是通過設(shè)置私用信號量。其中sem1是線程PA的私用信號量,sem2是線程PB的私用信號量,其初值根據(jù)具體資源情況而定,一般為一個(gè)正整數(shù),一個(gè)為零.私用信號量只能由其擁有者對其進(jìn)行P操作,即線程只能由自己將自己阻塞,而不能由對方阻塞,但兩者可通過V操作彼此喚醒。6多線程編程的應(yīng)用實(shí)例下面通過創(chuàng)建兩個(gè)線程來實(shí)現(xiàn)對一個(gè)數(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(){/*用默認(rèn)屬性初始化互斥鎖*/pthread_mutex_init(&mu,NULL);thread_create();thread_wait();return0;}該實(shí)例主要是說明兩個(gè)線程的互斥,在主函數(shù)中首先創(chuàng)建了thread[0],thread[0]中對全局變量number++,之后創(chuàng)建了thread[1],thread[1]同樣對全局變量number++,而且兩個(gè)線程在對number操作時(shí)都用了互斥鎖,所以在一個(gè)線程對number操作時(shí)另外一個(gè)線程會(huì)停在pthread_mutex_

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論