線程控制PPT演示課件_第1頁
線程控制PPT演示課件_第2頁
線程控制PPT演示課件_第3頁
線程控制PPT演示課件_第4頁
線程控制PPT演示課件_第5頁
已閱讀5頁,還剩19頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1,線程是進程中的一個實體,是CPU調(diào)度和分配的基本單位.線程共享資源,同一進程的多個線程共享同一地址空間,因此Text Segment、Data Segment都是共享的,如果定義一個函數(shù),在各線程中都可以調(diào)用,如果定義一個全局變量,在各線程中都可以訪問到。,Linux下線程控制,2,除此之外,各線程還共享以下進程資源和環(huán)境: 文件描述符表 每種信號的處理方式(SIG_IGN、SIG_DFL或者自定義的信號處理函數(shù)) 當前工作目錄 用戶id和組id線程獨享資源 線程id 上下文,包括各種寄存器的值、程序計數(shù)器和棧指針 ??臻g errno變量 信號屏蔽字 調(diào)度優(yōu)先級,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,失敗返回錯誤號。 thread: 線程標識符 attr: 線程屬性設置,沒有特殊設定,設置為NULL start_routine:線程函數(shù)起始地址 arg: 傳遞給start_routine的參數(shù),Linux下線程控制,4,關鍵字restrict只用于限定指針; 該關鍵字用于告知編譯器,所有修改該指針所指向內(nèi)容的 操作全部都是基于(base on)該指針的,即不存在其它進 行修改操作的途徑;這樣的后果是幫助編譯器進行更好的 代碼優(yōu)化,生成更有效率的匯編代碼。 (具體見0-restrict.doc),Linux下線程控制,5,涉及多參數(shù)傳遞給線程的,需要使用結(jié)構(gòu)體將參數(shù)封裝后,將結(jié)構(gòu)體指針傳給線程定義一個結(jié)構(gòu)體,例如:struct mypara var para1;/參數(shù)1 var para2;/參數(shù)2將這個結(jié)構(gòu)體指針,作為void *形參的實際參數(shù)傳遞struct mypara pstru;pthread_create(,Linux下線程控制,6,函數(shù)中要定義一個mypara類型的結(jié)構(gòu)指針來引用這個參數(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ù)只有一個void *型的指針,這就意味著只能通過結(jié)構(gòu)體封裝超過一個以上的參數(shù)作為一個整體傳遞。這是pthread_create函數(shù)的接口限定的,定義中已經(jīng)明確表明只接受一個參數(shù),你硬要塞給他兩個肯定會出錯了。所以通過結(jié)構(gòu)體這種組合結(jié)構(gòu)變通一下,同樣實現(xiàn)了只通過一個參數(shù)傳遞,但通過結(jié)構(gòu)指針對結(jié)構(gòu)數(shù)據(jù)成員的 引用實現(xiàn)多參數(shù)的傳遞。,Linux下線程控制,8,一個線程可以調(diào)用pthread_cancel終止同一進程中的另一個線程,可以調(diào)用pthread_exit終止自己。#include void pthread_exit( void *retval ) retval: pthread_exit調(diào)用者線程的返回值,可由其他函數(shù)和pthread_join來檢測獲取。 注意,pthread_exit或者return返回的指針所指向的內(nèi)存單元必須是全局的或者是用malloc分配的,不能在線程函數(shù)的棧上分配,因為當其它線程得到這個返回指針時線程函數(shù)已經(jīng)退出了。,Linux下線程控制,9,pthread_cancel #include int pthread_cancel(pthread_t id) 返回值: 若成功返回0,否則返回錯誤編號 pthread_cancel并不等待線程終止,它僅僅提出請求。,Linux下線程控制,10,看一下pthread_cancel()的用法:線程取消的方法是向目標線程發(fā)Cancel信號,但如何處理 Cancel信號則由目標線程自己決定,或者忽略、或者立即終止、或者繼續(xù)運行至Cancelation-point(取消點),由不同的Cancelation狀態(tài)決定。 線程接收到CANCEL信號的缺省處理(即pthread_create()創(chuàng)建線程的缺省狀態(tài))是繼續(xù)運行至取消點,也就是說設置一個CANCELED狀態(tài),線程繼續(xù)運行,只有運行至Cancelation-point的時候才會退出。,Linux下線程控制,11,什么是線程取消點 根 據(jù)POSIX標準,pthread_join()、pthread_testcancel()、pthread_cond_wait()、 pthread_cond_timedwait()、sem_wait()、sigwait()等函數(shù)以及read()、write()等會引起阻塞的系統(tǒng)調(diào)用都是Cancelation-point(支持的不好),而其他pthread函數(shù)不會引起Cancelation動作。 可以在需要作為Cancelation-point的系統(tǒng)調(diào)用前后調(diào)用 pthread_testcancel(),從而起到取消點的作用。,Linux下線程控制,12,可以在需要作為Cancelation-point的系統(tǒng)調(diào)用前后調(diào)用 pthread_testcancel(),從而起到取消點的作用。如: pthread_testcancel(); retcode = read(fd, buffer, length); pthread_testcancel(); 另例如,如果線程處于無限循環(huán)中,且循環(huán)體內(nèi)沒有執(zhí)行至取消點的必然路徑,則線程無法由外部其他線程的取消請求而終止。因此在這樣的循環(huán)體的必經(jīng)路徑上應該加入pthread_testcancel()調(diào)用。,Linux下線程控制,13,int pthread_setcancelstate(int state, int *oldstate) 設置本線程對Cancel信號的反應state有兩種值:PTHREAD_CANCEL_ENABLE(缺?。┖?PTHREAD_CANCEL_DISABLE,分別表示收到信號后設為CANCLED狀態(tài)和忽略CANCEL信號繼續(xù)運行;old_state:如果不為NULL則存入原來的Cancel狀態(tài)。以便恢復。,Linux下線程控制,14,int pthread_setcanceltype(int type, int *oldtype) 設置本線程取消動作的執(zhí)行時機type由兩種取值:PTHREAD_CANCEL_DEFFERED和PTHREAD_CANCEL_ASYCHRONOUS,僅當Cancel狀態(tài)為Enable時有效,分別表示收到信號后繼續(xù)運行至下一個取消點再退出和立即執(zhí)行取消動作(退出);oldtype如果不為NULL則存入運來的取消動作類型值。void pthread_testcancel(void) 檢查本線程是否處于Canceld狀態(tài),如果是,則進行取消動作,否則直接返回。,Linux下線程控制,15,等待線程退出:int pthread_join( pthread_t *th,void * value_ptr) th: 等待線程的標識符 value_ptr :用戶定義指針,用來存儲被等待線程的返回值, 調(diào)用該函數(shù)的線程將掛起等待,直到id為th的線程終止。,Linux下線程控制,16,thread線程以不同的方法終止,通過pthread_join得到的終止狀態(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ù)。 如果對thread線程的終止狀態(tài)不感興趣,可以傳NULL給value_ptr參數(shù)。,Linux下線程控制,18,一般情況下,線程終止后,其終止狀態(tài)一直保留到其它線 程調(diào)用pthread_join獲取它的狀態(tài)為止。 但是線程也可以被置為detach狀態(tài),這樣的線程一旦終止 就立刻回收它占用的所有資源,而不保留終止狀態(tài)。 不能對一個已經(jīng)處于detach狀態(tài)的線程調(diào)用pthread_join, 這樣的調(diào)用將返回EINVAL。,Linux下線程控制,19,對一個尚未detach的線程調(diào)用pthread_join或 pthread_detach都可以把該線程置為detach狀態(tài),也就是 說,不能對同一線程調(diào)用兩次pthread_join,或者如果已 經(jīng)對一個線程調(diào)用了pthread_detach就不能再調(diào)用pthread_join了。int pthread_detach(pthread_t tid); 返回值:成功返回0,失敗返回錯誤號。,Linux下線程控制,20,線程可以安排它退出時需要調(diào)用的函數(shù),這樣的函數(shù)稱為線程清理處理程序,線程可以建立多個清理處理程序。處理程序記錄在棧中,也就是說它們的執(zhí)行順序與它們注冊時的順序相反。pthread_cleanup_push()函數(shù)執(zhí)行壓棧(注冊)清理函數(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ù)的同時執(zhí)行該注冊函數(shù),為0表示不執(zhí)行,非0為執(zhí)行。,Linux下線程控制,22,pthread_cleanup_push來注冊清理函數(shù)rtn, 這個函數(shù)有一個參數(shù)arg。 在以下三種情形之一發(fā)生時,注冊的清理函數(shù)被執(zhí)行: 1)調(diào)用pthread_exit,而不是直接return。 2)作為對取消線程請求(pthread_cancel)的響應。 3)以非0參數(shù)調(diào)用pthread_cleanup_pop。,Linux下線程控制,23,注意: 1)如果線程只是由于簡單的返回(return)而終止的,則清除函數(shù)不會被調(diào)用。 2)如果pthread_cleanup_pop被傳遞0參數(shù),則清除函數(shù)不會被調(diào)用,但是會清除處于棧頂?shù)那謇砗瘮?shù)。,Linux下線程控制,24,1.當pthread_cleanup_pop

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論