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

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 閱讀(751) 評論(0)  編輯 收藏 引用 所屬分類: Linux_Coding
<2010年5月>
2526272829301
2345678
9101112131415
16171819202122
23242526272829
303112345

常用鏈接

留言簿(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>
            裸体素人女欧美日韩| 一区二区激情| 牛牛国产精品| 美国三级日本三级久久99| 亚洲精品国产精品国自产在线 | 国产一区二区三区高清| 久久精品亚洲一区二区| 久久久国产精品亚洲一区| 亚洲高清视频一区| 日韩一级黄色片| 国产精品一区二区黑丝| 久久人人爽国产| 欧美激情欧美狂野欧美精品| 亚洲一区二区在线| 久久精品亚洲乱码伦伦中文| 亚洲精品字幕| 亚洲欧美美女| 亚洲精品在线观看免费| 亚洲欧美综合国产精品一区| 国产在线视频欧美一区二区三区| 欧美激情精品久久久久| 国产精品乱看| 欧美高清视频| 国产美女一区二区| 欧美国产综合一区二区| 国产精品一区久久| 亚洲国产一区二区a毛片| 欧美日韩亚洲网| 麻豆免费精品视频| 国产精品久久久久久久久久ktv | 亚洲美女色禁图| 精东粉嫩av免费一区二区三区| 亚洲美女av网站| 在线看国产一区| 欧美一区二区三区久久精品| 一本在线高清不卡dvd| 久久精品一区二区三区不卡| 亚洲男人影院| 欧美精品日日鲁夜夜添| 毛片av中文字幕一区二区| 亚洲最新视频在线| 亚洲国产精品成人综合| 午夜精品久久久久| 亚洲一区国产视频| 欧美精品日韩一区| 欧美激情视频一区二区三区不卡| 国产日韩欧美在线看| 在线亚洲电影| 亚洲视频一区二区免费在线观看| 蜜臀va亚洲va欧美va天堂| 久久人人爽人人爽| 国际精品欧美精品| 先锋影音一区二区三区| 亚洲欧美一区二区精品久久久| 欧美片第一页| 亚洲欧洲日本一区二区三区| 91久久综合| 欧美jizzhd精品欧美巨大免费| 久久综合九色九九| 影院欧美亚洲| 久久亚洲欧美国产精品乐播| 免费成人高清| 亚洲国产天堂网精品网站| 久久婷婷国产综合国色天香| 久久这里有精品15一区二区三区| 国语自产精品视频在线看8查询8| 欧美专区在线观看一区| 久久精品一本| 一区二区亚洲精品国产| 久久亚洲风情| 亚洲人成精品久久久久| 一区二区三区高清视频在线观看| 欧美理论片在线观看| 夜夜嗨av一区二区三区四季av| 在线视频免费在线观看一区二区| 欧美视频中文在线看| 亚洲性视频网址| 久久九九全国免费精品观看| 国内精品视频久久| 欧美成人首页| 亚洲桃花岛网站| 久久久久在线| 亚洲精品五月天| 国产精品成人一区二区三区夜夜夜 | 欧美国产欧美综合 | 亚洲国产午夜| 欧美三级视频在线播放| 亚洲欧美大片| 美女999久久久精品视频| 亚洲美女中出| 国产欧美一区二区三区在线看蜜臀| 欧美中文字幕在线播放| 亚洲黄色av一区| 欧美中文字幕精品| 日韩视频不卡| 国产视频一区三区| 欧美大片网址| 欧美一区亚洲二区| 亚洲精选成人| 久热精品在线视频| 亚洲在线视频观看| 亚洲国产经典视频| 国产精品美女久久久久av超清| 久久久人成影片一区二区三区观看| 亚洲人成7777| 久久久综合精品| 麻豆精品视频在线| 亚洲一区二区三区精品在线观看| 国产一区二区中文字幕免费看| 欧美激情久久久久久| 性欧美xxxx视频在线观看| 亚洲精品乱码久久久久久日本蜜臀 | 亚洲电影免费观看高清完整版在线| 欧美日韩精品高清| 美日韩丰满少妇在线观看| 亚洲欧美在线另类| 一区二区激情小说| 亚洲激情专区| 欧美gay视频激情| 久久久久久有精品国产| 亚洲综合第一页| 夜夜爽夜夜爽精品视频| 在线看视频不卡| 国内精品视频666| 国产亚洲女人久久久久毛片| 国产精品二区二区三区| 欧美日韩1080p| 欧美极品在线观看| 你懂的国产精品永久在线| 久久精品一区蜜桃臀影院| 午夜一区二区三区不卡视频| 亚洲一级黄色片| 一区二区三区日韩精品视频| 亚洲美女精品一区| 亚洲精品乱码久久久久久按摩观| 欧美激情bt| 欧美国产欧美亚洲国产日韩mv天天看完整 | 欧美在线国产| 羞羞视频在线观看欧美| 亚洲欧美中日韩| 欧美一区二区视频免费观看| 午夜激情综合网| 欧美一区二区三区久久精品茉莉花| 亚洲一区影院| 欧美一级片在线播放| 欧美一区二区三区视频| 欧美伊人久久久久久久久影院 | 乱码第一页成人| 久久久水蜜桃| 欧美a级片网| 亚洲激情啪啪| 一本大道久久a久久精品综合 | 亚洲国产精品一区二区尤物区| 亚洲黄色视屏| 9久re热视频在线精品| 亚洲一区二区在线| 欧美一级日韩一级| 久久综合九色综合久99| 欧美大色视频| 欧美午夜在线视频| 国产欧美日韩综合| 1204国产成人精品视频| 亚洲精品一区在线| 午夜精品999| 91久久一区二区| 亚洲视频中文字幕| 久久久999成人| 亚洲国产精品成人久久综合一区| 日韩视频在线你懂得| 亚洲欧美激情诱惑| 久久网站热最新地址| 欧美剧在线观看| 国产在线观看精品一区二区三区 | 国产伦理一区| 亚洲高清成人| 亚洲欧美日韩在线高清直播| 久久婷婷激情| 日韩亚洲欧美中文三级| 欧美一区二区三区在线观看视频| 欧美mv日韩mv国产网站app| 国产精品久久久久aaaa| 在线观看成人网| 亚洲欧美视频在线观看| 欧美成人精品不卡视频在线观看 | 久热精品在线| 亚洲网站在线观看| 欧美搞黄网站| 含羞草久久爱69一区| 亚洲天堂成人在线视频| 免费观看日韩| 亚洲天堂av在线免费观看| 美国十次了思思久久精品导航| 国产精品网站在线播放| 亚洲日韩中文字幕在线播放| 久久久.com| 午夜电影亚洲| 国产精品日韩一区二区三区| 99www免费人成精品| 每日更新成人在线视频| 午夜精品国产更新|