青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

posts - 297,  comments - 15,  trackbacks - 0
這是一個關于Posix線程編程的專欄。作者在闡明概念的基礎上,將向您詳細講述Posix線程庫API。本文是第一篇將向您講述線程的創建與取消。
一、線程創建
1.1 線程與進程
相對進程而言,線程是一個更加接近于執行體的概念,它可以與同進程中的其他線程共享數據,但擁有自己的棧空間,擁有獨立的執行序列。在串行程序基礎上引入線程和進程是為了提高程序的并發度,從而提高程序運行效率和響應時間。
線程和進程在使用上各有優缺點:線程執行開銷小,但不利于資源的管理和保護;而進程正相反。同時,線程適合于在SMP機器上運行,而進程則可以跨機器遷移。
1.2 創建線程
POSIX通過pthread_create()函數創建線程,API定義如下:
int  pthread_create(pthread_t  *  thread, pthread_attr_t * attr, 
void * (*start_routine)(void *), void * arg)
與fork()調用創建一個進程的方法不同,pthread_create()創建的線程并不具備與主線程(即調用pthread_create()的線 程)同樣的執行序列,而是使其運行start_routine(arg)函數。thread返回創建的線程ID,而attr是創建線程時設置的線程屬性 (見下)。pthread_create()的返回值表示線程創建是否成功。盡管arg是void *類型的變量,但它同樣可以作為任意類型的參數傳給start_routine()函數;同時,start_routine()可以返回一個void *類型的返回值,而這個返回值也可以是其他類型,并由pthread_join()獲取。
1.3 線程創建屬性
pthread_create()中的attr參數是一個結構指針,結構中的元素分別對應著新線程的運行屬性,主要包括以下幾項:
__detachstate,表示新線程是否與進程中其他線程脫離同步,如果置位則新線程不能用pthread_join()來同步,且在退出時自行釋放 所占用的資源。缺省為PTHREAD_CREATE_JOINABLE狀態。這個屬性也可以在線程創建并運行以后用pthread_detach()來設 置,而一旦設置為PTHREAD_CREATE_DETACH狀態(不論是創建時設置還是運行時設置)則不能再恢復到 PTHREAD_CREATE_JOINABLE狀態。
__schedpolicy,表示新線程的調度策略,主要包括SCHED_OTHER(正常、非實時)、SCHED_RR(實時、輪轉法)和 SCHED_FIFO(實時、先入先出)三種,缺省為SCHED_OTHER,后兩種調度策略僅對超級用戶有效。運行時可以用過 pthread_setschedparam()來改變。
__schedparam,一個struct sched_param結構,目前僅有一個sched_priority整型變量表示線程的運行優先級。這個參數僅當調度策略為實時(即SCHED_RR 或SCHED_FIFO)時才有效,并可以在運行時通過pthread_setschedparam()函數來改變,缺省為0。
__inheritsched,有兩種值可供選擇:PTHREAD_EXPLICIT_SCHED和PTHREAD_INHERIT_SCHED,前者表 示新線程使用顯式指定調度策略和調度參數(即attr中的值),而后者表示繼承調用者線程的值。缺省為PTHREAD_EXPLICIT_SCHED。
__scope,表示線程間競爭CPU的范圍,也就是說線程優先級的有效范圍。POSIX的標準中定義了兩個值: PTHREAD_SCOPE_SYSTEM和PTHREAD_SCOPE_PROCESS,前者表示與系統中所有線程一起競爭CPU時間,后者表示僅與同 進程中的線程競爭CPU。目前LinuxThreads僅實現了PTHREAD_SCOPE_SYSTEM一值。
pthread_attr_t結構中還有一些值,但不使用pthread_create()來設置。
為了設置這些屬性,POSIX定義了一系列屬性設置函數,包括pthread_attr_init()、pthread_attr_destroy()和與各個屬性相關的pthread_attr_get---/pthread_attr_set---函數。
1.4 線程創建的Linux實現
我們知道,Linux的線程實現是在核外進行的,核內提供的是創建進程的接口do_fork()。內核提供了兩個系統調用__clone()和fork (),最終都用不同的參數調用do_fork()核內API。當然,要想實現線程,沒有核心對多進程(其實是輕量級進程)共享數據段的支持是不行的,因 此,do_fork()提供了很多參數,包括CLONE_VM(共享內存空間)、CLONE_FS(共享文件系統信息)、CLONE_FILES(共享文 件描述符表)、CLONE_SIGHAND(共享信號句柄表)和CLONE_PID(共享進程ID,僅對核內進程,即0號進程有效)。當使用fork系統 調用時,內核調用do_fork()不使用任何共享屬性,進程擁有獨立的運行環境,而使用pthread_create()來創建線程時,則最終設置了所 有這些屬性來調用__clone(),而這些參數又全部傳給核內的do_fork(),從而創建的"進程"擁有共享的運行環境,只有棧是獨立的,由 __clone()傳入。
Linux線程在核內是以輕量級進程的形式存在的,擁有獨立的進程表項,而所有的創建、同步、刪除等操作都在核外pthread庫中進行。pthread 庫使用一個管理線程(__pthread_manager(),每個進程獨立且唯一)來管理線程的創建和終止,為線程分配線程ID,發送線程相關的信號 (比如Cancel),而主線程(pthread_create())的調用者則通過管道將請求信息傳給管理線程。
二、線程取消
2.1 線程取消的定義
一般情況下,線程在其主體函數退出的時候會自動終止,但同時也可以因為接收到另一個線程發來的終止(取消)請求而強制終止。
2.2 線程取消的語義
線程取消的方法是向目標線程發Cancel信號,但如何處理Cancel信號則由目標線程自己決定,或者忽略、或者立即終止、或者繼續運行至Cancelation-point(取消點),由不同的Cancelation狀態決定。
線程接收到CANCEL信號的缺省處理(即pthread_create()創建線程的缺省狀態)是繼續運行至取消點,也就是說設置一個CANCELED狀態,線程繼續運行,只有運行至Cancelation-point的時候才會退出。
2.3 取消點
根據POSIX標準,pthread_join()、pthread_testcancel()、pthread_cond_wait()、 pthread_cond_timedwait()、sem_wait()、sigwait()等函數以及read()、write()等會引起阻塞的系 統調用都是Cancelation-point,而其他pthread函數都不會引起Cancelation動作。但是pthread_cancel的手 冊頁聲稱,由于LinuxThread庫與C庫結合得不好,因而目前C庫函數都不是Cancelation-point;但CANCEL信號會使線程從阻 塞的系統調用中退出,并置EINTR錯誤碼,因此可以在需要作為Cancelation-point的系統調用前后調用 pthread_testcancel(),從而達到POSIX標準所要求的目標,即如下代碼段:
pthread_testcancel();
    retcode = read(fd, buffer, length);
    pthread_testcancel();
2.4 程序設計方面的考慮
如果線程處于無限循環中,且循環體內沒有執行至取消點的必然路徑,則線程無法由外部其他線程的取消請求而終止。因此在這樣的循環體的必經路徑上應該加入pthread_testcancel()調用。
2.5 與線程取消相關的pthread函數
int pthread_cancel(pthread_t thread)
發送終止信號給thread線程,如果成功則返回0,否則為非0值。發送成功并不意味著thread會終止。
int pthread_setcancelstate(int state, int *oldstate)
設置本線程對Cancel信號的反應,state有兩種值:PTHREAD_CANCEL_ENABLE(缺省)和 PTHREAD_CANCEL_DISABLE,分別表示收到信號后設為CANCLED狀態和忽略CANCEL信號繼續運行;old_state如果不為 NULL則存入原來的Cancel狀態以便恢復。
int pthread_setcanceltype(int type, int *oldtype)
設置本線程取消動作的執行時機,type由兩種取值:PTHREAD_CANCEL_DEFFERED和 PTHREAD_CANCEL_ASYCHRONOUS,僅當Cancel狀態為Enable時有效,分別表示收到信號后繼續運行至下一個取消點再退出和 立即執行取消動作(退出);oldtype如果不為NULL則存入運來的取消動作類型值。
void pthread_testcancel(void)
檢查本線程是否處于Canceld狀態,如果是,則進行取消動作,否則直接返回。
轉自:

posted on 2009-11-25 15:22 chatler 閱讀(758) 評論(0)  編輯 收藏 引用 所屬分類: Linux_Coding
<2010年11月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

常用鏈接

留言簿(10)

隨筆分類(307)

隨筆檔案(297)

algorithm

Books_Free_Online

C++

database

Linux

Linux shell

linux socket

misce

  • cloudward
  • 感覺這個博客還是不錯,雖然做的東西和我不大相關,覺得看看還是有好處的

network

OSS

  • Google Android
  • Android is a software stack for mobile devices that includes an operating system, middleware and key applications. This early look at the Android SDK provides the tools and APIs necessary to begin developing applications on the Android platform using the Java programming language.
  • os161 file list

overall

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲午夜精品久久| 久久av一区二区| 欧美精品成人一区二区在线观看 | 亚洲精品一区二区三区av| 久久亚洲国产成人| 亚洲国产网站| 亚洲精品久久7777| 欧美日韩午夜剧场| 午夜精品久久久久久| 性久久久久久久久久久久| 狠狠网亚洲精品| 亚洲国产精品一区二区www| 欧美日韩成人综合在线一区二区| 一区二区三区高清不卡| 亚洲一区二区在线免费观看| 国产亚洲福利一区| 欧美高清免费| 国产精品国产三级国产专区53 | 亚洲另类自拍| 国产精品久久久久久久久免费桃花 | 国内久久婷婷综合| 亚洲国产一区二区视频| 国产精品乱码一区二区三区| 久久香蕉国产线看观看网| 美女主播精品视频一二三四| 亚洲在线日韩| 久久国内精品视频| a4yy欧美一区二区三区| 亚洲欧美综合精品久久成人| 亚洲精品1区2区| 亚洲人成人一区二区三区| 国产精品日韩欧美| 亚洲高清视频在线| 国产农村妇女精品一二区| 欧美韩日一区| 国产欧美日韩视频在线观看| 91久久精品日日躁夜夜躁国产| 国产精品日韩欧美一区二区三区 | 欧美一区二区网站| 欧美激情按摩| 久久福利电影| 欧美日韩午夜| 亚洲高清123| 国产在线播放一区二区三区| 99re热这里只有精品视频| 伊人夜夜躁av伊人久久| 亚洲欧美日韩精品久久奇米色影视| 91久久精品日日躁夜夜躁欧美| 香蕉久久夜色精品| 亚洲欧美日韩区| 欧美精品二区三区四区免费看视频| 久久久久久久综合狠狠综合| 国产精品一区二区久久| 亚洲精品视频免费在线观看| 国产一区二区av| 亚洲影院高清在线| 亚洲一区二区三区免费在线观看| 欧美 日韩 国产在线| 美女999久久久精品视频| 国产精品午夜国产小视频| 亚洲精品影院在线观看| 亚洲精品永久免费精品| 久久综合网hezyo| 毛片一区二区| 影视先锋久久| 久久久久久综合| 久久综合色影院| 在线电影院国产精品| 久久精品五月婷婷| 久久婷婷久久| 在线播放一区| 欧美成人免费视频| 亚洲精品视频免费| 在线一区观看| 国产精品久久久一本精品| 99精品视频免费观看视频| 亚洲一区二区少妇| 国产精品福利网站| 亚洲欧美日韩区 | 亚洲国产成人不卡| 欧美xart系列在线观看| 亚洲电影免费在线 | 激情欧美丁香| 麻豆国产精品一区二区三区 | 欧美一区=区| 国内外成人在线视频| 久久伊伊香蕉| 亚洲美女毛片| 欧美在线观看网址综合| 国产在线不卡视频| 葵司免费一区二区三区四区五区| 欧美激情在线有限公司| 一区二区三区四区在线| 国产精品香蕉在线观看| 久久久久免费| 日韩视频中文| 欧美制服丝袜| 亚洲精品免费观看| 国产乱码精品| 老鸭窝91久久精品色噜噜导演| 亚洲黄色有码视频| 欧美一级精品大片| 91久久极品少妇xxxxⅹ软件| 欧美四级电影网站| 久久天堂国产精品| 99热这里只有成人精品国产| 久久国产精品亚洲va麻豆| 亚洲国产你懂的| 欧美日韩在线观看一区二区三区| 欧美在线资源| 99精品国产一区二区青青牛奶 | 一本色道88久久加勒比精品| 国产欧美一区二区精品性| 欧美成年人视频网站| 羞羞视频在线观看欧美| 亚洲精品欧美日韩| 久久尤物视频| 午夜精品久久久久久99热软件| 18成人免费观看视频| 国产麻豆午夜三级精品| 欧美另类一区| 欧美bbbxxxxx| 久久精品中文字幕一区| 亚洲一区在线免费观看| 91久久黄色| 蜜桃伊人久久| 欧美在线观看天堂一区二区三区| 日韩视频免费| 91久久精品久久国产性色也91 | 欧美三级欧美一级| 欧美国产丝袜视频| 久久色在线播放| 久久aⅴ国产紧身牛仔裤| 中国成人亚色综合网站| 亚洲人成网站999久久久综合| 久久婷婷丁香| 久久久爽爽爽美女图片| 欧美一区二区三区视频在线观看| 亚洲系列中文字幕| 日韩亚洲国产精品| 国产亚洲女人久久久久毛片| 国产精品免费看片| 国产精品入口日韩视频大尺度| 欧美精品在欧美一区二区少妇| 免费人成精品欧美精品| 久久中文字幕一区| 欧美xart系列高清| 欧美激情一区在线| 欧美日韩国产综合视频在线观看中文 | 一区二区欧美国产| 中国av一区| 亚洲女性裸体视频| 欧美一区二区视频在线| 欧美一区二区三区成人| 久久精品二区三区| 美女被久久久| 欧美欧美天天天天操| 欧美日韩中文字幕综合视频| 欧美吻胸吃奶大尺度电影| 欧美午夜电影网| 国产精品天天看| 国内伊人久久久久久网站视频| 激情六月婷婷久久| 亚洲精品网站在线播放gif| aaa亚洲精品一二三区| 亚洲一区二区在线| 久久精品欧美日韩| 欧美~级网站不卡| 亚洲欧洲日本国产| 亚洲男人的天堂在线aⅴ视频| 香蕉久久一区二区不卡无毒影院 | 99re6这里只有精品| 亚洲天堂av高清| 久久久久在线| 欧美久久一区| 国产偷国产偷精品高清尤物| 在线观看日韩av电影| 99亚洲视频| 久久亚洲精品视频| 日韩视频精品在线| 久久国产精品免费一区| 欧美激情久久久| 国产一区二区在线观看免费播放| 亚洲激情网址| 欧美一区二区三区另类| 亚洲国产电影| 欧美一级精品大片| 欧美日韩三级在线| 国内精品模特av私拍在线观看| 99精品福利视频| 久热精品视频| 亚洲一区日本| 欧美日本一区| 亚洲第一区色| 欧美在线视频免费观看| 亚洲激情自拍| 久久久久久久一区二区| 国产精品你懂得| 一片黄亚洲嫩模| 欧美激情91|