




已閱讀5頁(yè),還剩19頁(yè)未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1,線程是進(jìn)程中的一個(gè)實(shí)體,是CPU調(diào)度和分配的基本單位.線程共享資源,同一進(jìn)程的多個(gè)線程共享同一地址空間,因此Text Segment、Data Segment都是共享的,如果定義一個(gè)函數(shù),在各線程中都可以調(diào)用,如果定義一個(gè)全局變量,在各線程中都可以訪問到。,Linux下線程控制,2,除此之外,各線程還共享以下進(jìn)程資源和環(huán)境: 文件描述符表 每種信號(hào)的處理方式(SIG_IGN、SIG_DFL或者自定義的信號(hào)處理函數(shù)) 當(dāng)前工作目錄 用戶id和組id線程獨(dú)享資源 線程id 上下文,包括各種寄存器的值、程序計(jì)數(shù)器和棧指針 ??臻g errno變量 信號(hào)屏蔽字 調(diào)度優(yōu)先級(jí),Linux下線程控制,3,線程控制創(chuàng)建線程 #include int pthread_create(pthread_t *restrict thread, const pthread_attr_t *restrict attr, void *(*start_routine)(void*), void *restrict arg); 返回值:成功返回0,失敗返回錯(cuò)誤號(hào)。 thread: 線程標(biāo)識(shí)符 attr: 線程屬性設(shè)置,沒有特殊設(shè)定,設(shè)置為NULL start_routine:線程函數(shù)起始地址 arg: 傳遞給start_routine的參數(shù),Linux下線程控制,4,關(guān)鍵字restrict只用于限定指針; 該關(guān)鍵字用于告知編譯器,所有修改該指針?biāo)赶騼?nèi)容的 操作全部都是基于(base on)該指針的,即不存在其它進(jìn) 行修改操作的途徑;這樣的后果是幫助編譯器進(jìn)行更好的 代碼優(yōu)化,生成更有效率的匯編代碼。 (具體見0-restrict.doc),Linux下線程控制,5,涉及多參數(shù)傳遞給線程的,需要使用結(jié)構(gòu)體將參數(shù)封裝后,將結(jié)構(gòu)體指針傳給線程定義一個(gè)結(jié)構(gòu)體,例如:struct mypara var para1;/參數(shù)1 var para2;/參數(shù)2將這個(gè)結(jié)構(gòu)體指針,作為void *形參的實(shí)際參數(shù)傳遞struct mypara pstru;pthread_create(,Linux下線程控制,6,函數(shù)中要定義一個(gè)mypara類型的結(jié)構(gòu)指針來引用這個(gè)參數(shù) void *thr_fn(void *arg) mypara *pstru; pstru = (* struct mypara) arg; pstru-para1 . ;/參數(shù)1的操作 pstru-para2 ;/參數(shù)2的操作 ,Linux下線程控制,7,pthread_create函數(shù)接受的參數(shù)只有一個(gè)void *型的指針,這就意味著只能通過結(jié)構(gòu)體封裝超過一個(gè)以上的參數(shù)作為一個(gè)整體傳遞。這是pthread_create函數(shù)的接口限定的,定義中已經(jīng)明確表明只接受一個(gè)參數(shù),你硬要塞給他兩個(gè)肯定會(huì)出錯(cuò)了。所以通過結(jié)構(gòu)體這種組合結(jié)構(gòu)變通一下,同樣實(shí)現(xiàn)了只通過一個(gè)參數(shù)傳遞,但通過結(jié)構(gòu)指針對(duì)結(jié)構(gòu)數(shù)據(jù)成員的 引用實(shí)現(xiàn)多參數(shù)的傳遞。,Linux下線程控制,8,一個(gè)線程可以調(diào)用pthread_cancel終止同一進(jìn)程中的另一個(gè)線程,可以調(diào)用pthread_exit終止自己。#include void pthread_exit( void *retval ) retval: pthread_exit調(diào)用者線程的返回值,可由其他函數(shù)和pthread_join來檢測(cè)獲取。 注意,pthread_exit或者return返回的指針?biāo)赶虻膬?nèi)存單元必須是全局的或者是用malloc分配的,不能在線程函數(shù)的棧上分配,因?yàn)楫?dāng)其它線程得到這個(gè)返回指針時(shí)線程函數(shù)已經(jīng)退出了。,Linux下線程控制,9,pthread_cancel #include int pthread_cancel(pthread_t id) 返回值: 若成功返回0,否則返回錯(cuò)誤編號(hào) pthread_cancel并不等待線程終止,它僅僅提出請(qǐng)求。,Linux下線程控制,10,看一下pthread_cancel()的用法:線程取消的方法是向目標(biāo)線程發(fā)Cancel信號(hào),但如何處理 Cancel信號(hào)則由目標(biāo)線程自己決定,或者忽略、或者立即終止、或者繼續(xù)運(yùn)行至Cancelation-point(取消點(diǎn)),由不同的Cancelation狀態(tài)決定。 線程接收到CANCEL信號(hào)的缺省處理(即pthread_create()創(chuàng)建線程的缺省狀態(tài))是繼續(xù)運(yùn)行至取消點(diǎn),也就是說設(shè)置一個(gè)CANCELED狀態(tài),線程繼續(xù)運(yùn)行,只有運(yùn)行至Cancelation-point的時(shí)候才會(huì)退出。,Linux下線程控制,11,什么是線程取消點(diǎn) 根 據(jù)POSIX標(biāo)準(zhǔn),pthread_join()、pthread_testcancel()、pthread_cond_wait()、 pthread_cond_timedwait()、sem_wait()、sigwait()等函數(shù)以及read()、write()等會(huì)引起阻塞的系統(tǒng)調(diào)用都是Cancelation-point(支持的不好),而其他pthread函數(shù)不會(huì)引起Cancelation動(dòng)作。 可以在需要作為Cancelation-point的系統(tǒng)調(diào)用前后調(diào)用 pthread_testcancel(),從而起到取消點(diǎn)的作用。,Linux下線程控制,12,可以在需要作為Cancelation-point的系統(tǒng)調(diào)用前后調(diào)用 pthread_testcancel(),從而起到取消點(diǎn)的作用。如: pthread_testcancel(); retcode = read(fd, buffer, length); pthread_testcancel(); 另例如,如果線程處于無限循環(huán)中,且循環(huán)體內(nèi)沒有執(zhí)行至取消點(diǎn)的必然路徑,則線程無法由外部其他線程的取消請(qǐng)求而終止。因此在這樣的循環(huán)體的必經(jīng)路徑上應(yīng)該加入pthread_testcancel()調(diào)用。,Linux下線程控制,13,int pthread_setcancelstate(int state, int *oldstate) 設(shè)置本線程對(duì)Cancel信號(hào)的反應(yīng)state有兩種值:PTHREAD_CANCEL_ENABLE(缺省)和 PTHREAD_CANCEL_DISABLE,分別表示收到信號(hào)后設(shè)為CANCLED狀態(tài)和忽略CANCEL信號(hào)繼續(xù)運(yùn)行;old_state:如果不為NULL則存入原來的Cancel狀態(tài)。以便恢復(fù)。,Linux下線程控制,14,int pthread_setcanceltype(int type, int *oldtype) 設(shè)置本線程取消動(dòng)作的執(zhí)行時(shí)機(jī)type由兩種取值:PTHREAD_CANCEL_DEFFERED和PTHREAD_CANCEL_ASYCHRONOUS,僅當(dāng)Cancel狀態(tài)為Enable時(shí)有效,分別表示收到信號(hào)后繼續(xù)運(yùn)行至下一個(gè)取消點(diǎn)再退出和立即執(zhí)行取消動(dòng)作(退出);oldtype如果不為NULL則存入運(yùn)來的取消動(dòng)作類型值。void pthread_testcancel(void) 檢查本線程是否處于Canceld狀態(tài),如果是,則進(jìn)行取消動(dòng)作,否則直接返回。,Linux下線程控制,15,等待線程退出:int pthread_join( pthread_t *th,void * value_ptr) th: 等待線程的標(biāo)識(shí)符 value_ptr :用戶定義指針,用來存儲(chǔ)被等待線程的返回值, 調(diào)用該函數(shù)的線程將掛起等待,直到id為th的線程終止。,Linux下線程控制,16,thread線程以不同的方法終止,通過pthread_join得到的終止?fàn)顟B(tài)是不同的,總結(jié)如下: 如果thread線程通過return返回,value_ptr所指向的單元里存放的是thread線程函數(shù)的返回值。 如果thread線程被別的線程調(diào)用pthread_cancel異常終止 的,value_ptr所指向的單元里存放的是常數(shù)PTHREAD_CANCELED,即(void *) -1) 。,Linux下線程控制,17,如果thread線程是自己調(diào)用pthread_exit終止的,value_ptr所指向的單元存放的是傳給pthread_exit的參數(shù)。 如果對(duì)thread線程的終止?fàn)顟B(tài)不感興趣,可以傳NULL給value_ptr參數(shù)。,Linux下線程控制,18,一般情況下,線程終止后,其終止?fàn)顟B(tài)一直保留到其它線 程調(diào)用pthread_join獲取它的狀態(tài)為止。 但是線程也可以被置為detach狀態(tài),這樣的線程一旦終止 就立刻回收它占用的所有資源,而不保留終止?fàn)顟B(tài)。 不能對(duì)一個(gè)已經(jīng)處于detach狀態(tài)的線程調(diào)用pthread_join, 這樣的調(diào)用將返回EINVAL。,Linux下線程控制,19,對(duì)一個(gè)尚未detach的線程調(diào)用pthread_join或 pthread_detach都可以把該線程置為detach狀態(tài),也就是 說,不能對(duì)同一線程調(diào)用兩次pthread_join,或者如果已 經(jīng)對(duì)一個(gè)線程調(diào)用了pthread_detach就不能再調(diào)用pthread_join了。int pthread_detach(pthread_t tid); 返回值:成功返回0,失敗返回錯(cuò)誤號(hào)。,Linux下線程控制,20,線程可以安排它退出時(shí)需要調(diào)用的函數(shù),這樣的函數(shù)稱為線程清理處理程序,線程可以建立多個(gè)清理處理程序。處理程序記錄在棧中,也就是說它們的執(zhí)行順序與它們注冊(cè)時(shí)的順序相反。pthread_cleanup_push()函數(shù)執(zhí)行壓棧(注冊(cè))清理函數(shù)的操作;pthread_cleanup_pop()函數(shù)執(zhí)行從棧中刪除清理函數(shù)的操作。,Linux下線程控制,21,#include 函數(shù)原型:void pthread_cleanup_push( void (*rtn)(void *), void *arg);rtn 處理程序入口地址arg 傳遞給處理函數(shù)的參數(shù)void pthread_cleanup_pop(int execute);execute表示執(zhí)行時(shí)是否在彈出清理函數(shù)的同時(shí)執(zhí)行該注冊(cè)函數(shù),為0表示不執(zhí)行,非0為執(zhí)行。,Linux下線程控制,22,pthread_cleanup_push來注冊(cè)清理函數(shù)rtn, 這個(gè)函數(shù)有一個(gè)參數(shù)arg。 在以下三種情形之一發(fā)生時(shí),注冊(cè)的清理函數(shù)被執(zhí)行: 1)調(diào)用pthread_exit,而不是直接return。 2)作為對(duì)取消線程請(qǐng)求(pthread_cancel)的響應(yīng)。 3)以非0參數(shù)調(diào)用pthread_cleanup_pop。,Linux下線程控制,23,注意: 1)如果線程只是由于簡(jiǎn)單的返回(return)而終止的,則清除函數(shù)不會(huì)被調(diào)用。 2)如果pthread_cleanup_pop被傳遞0參數(shù),則清除函數(shù)不會(huì)被調(diào)用,但是會(huì)清除處于棧頂?shù)那謇砗瘮?shù)。,Linux下線程控制,24,1.當(dāng)pthread_cleanup_pop
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年元宇宙社交平臺(tái)界面設(shè)計(jì)創(chuàng)新與用戶體驗(yàn)提升報(bào)告
- 2025屆湖北省武漢市部分學(xué)校英語七下期末達(dá)標(biāo)檢測(cè)試題含答案
- 2025年醫(yī)院信息化建設(shè)與電子病歷系統(tǒng)智能化的融合趨勢(shì)報(bào)告
- 2025年醫(yī)藥物流合規(guī)運(yùn)營(yíng)與信息化建設(shè)市場(chǎng)前景研究報(bào)告
- 2025年醫(yī)藥企業(yè)研發(fā)外包(CRO)在罕見病藥物研發(fā)中的應(yīng)用報(bào)告
- 2025年河南省舞鋼市七年級(jí)英語第二學(xué)期期末監(jiān)測(cè)試題含答案
- 哈爾濱市平房區(qū)2025屆英語八下期末檢測(cè)試題含答案
- 2025年裝備制造業(yè)自主創(chuàng)新能力與智能制造融合研究報(bào)告
- 安全試題及答案下載
- 安全生產(chǎn)知識(shí)考試題及答案
- 骨科手術(shù)后的康復(fù)用具與輔助器具
- 小學(xué)特色課程《口風(fēng)琴課程》校本教材
- 電腦教室搬遷方案
- 《如何寫文獻(xiàn)綜述》課件
- 汽車美容店計(jì)劃書案例
- 2023高教版中職中國(guó)特色社會(huì)主義基礎(chǔ)模塊課程標(biāo)準(zhǔn)
- 信息機(jī)房火災(zāi)事故應(yīng)急處置方案
- 火災(zāi)調(diào)查專業(yè)技能.全國(guó)比武單項(xiàng)科目解析
- 人衛(wèi)慕課《走進(jìn)肺功能》試題答案
- 抑郁癥健康教育
- 主體驗(yàn)收申請(qǐng)表
評(píng)論
0/150
提交評(píng)論