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

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>
            亚洲一区二区动漫| 国产精品二区在线| 9l视频自拍蝌蚪9l视频成人| 亚洲精品免费看| 亚洲国产激情| 99国产麻豆精品| 亚洲在线一区二区| 欧美影院一区| 欧美福利视频在线| 国产精品久久久久久影院8一贰佰| 国产精品久久久久久久久婷婷 | 亚洲主播在线播放| 欧美亚洲一区二区在线| 玖玖玖免费嫩草在线影院一区| 欧美福利电影在线观看| 国产精品麻豆va在线播放| 黄色精品一区二区| 99精品视频免费全部在线| 欧美淫片网站| 欧美激情亚洲综合一区| 亚洲夜间福利| 欧美国产日韩视频| 国产一区二区精品久久91| 日韩视频一区二区三区在线播放免费观看| 亚洲永久精品大片| 欧美成黄导航| 午夜日韩在线| 欧美日韩系列| 亚洲电影第1页| 性刺激综合网| 91久久久久久| 久久久久久97三级| 欧美精品综合| 亚洲经典视频在线观看| 亚洲欧美国产制服动漫| 欧美激情一区二区三区不卡| 性久久久久久久久| 国产精品扒开腿做爽爽爽软件| 尤物精品在线| 久久久夜精品| 亚洲欧美成人一区二区在线电影| 欧美搞黄网站| 亚洲高清一区二| 麻豆av一区二区三区| 小处雏高清一区二区三区| 国产精品二区三区四区| 亚洲视频一二三| 亚洲欧洲一区二区在线观看| 久久久另类综合| 国产永久精品大片wwwapp| 亚洲欧美激情在线视频| 99在线精品视频在线观看| 欧美日韩国产成人在线免费| 91久久久久久久久| 欧美激情在线| 欧美激情一区三区| 日韩亚洲国产欧美| 亚洲精品美女| 欧美日韩在线大尺度| 亚洲一级高清| 亚洲欧美成人网| 国产日产欧美精品| 久久亚洲欧洲| 蜜臀久久久99精品久久久久久| 亚洲国产精品www| 亚洲国产美女久久久久| 欧美美女福利视频| 亚洲在线观看免费视频| 午夜日韩激情| 亚洲福利视频免费观看| 亚洲人成绝费网站色www| 欧美日韩国产一中文字不卡| 午夜精品久久久久久99热软件| 亚洲综合99| 在线精品视频在线观看高清 | 亚洲精品系列| 国产精品成人v| 久久国产色av| 久热精品视频在线免费观看| 亚洲精品一区二区三区在线观看| 亚洲看片一区| 国产一区二区三区久久悠悠色av | 久久久久免费视频| 女同性一区二区三区人了人一| 宅男精品视频| 午夜精品一区二区三区电影天堂| 在线观看成人一级片| 亚洲免费成人| 国语自产精品视频在线看| 亚洲综合视频1区| 怡红院精品视频在线观看极品| 亚洲福利视频三区| 国产精品自拍小视频| 欧美**字幕| 国产精品video| 欧美国产一区二区三区激情无套| 欧美性事在线| 欧美福利网址| 国产精品亚洲网站| 欧美成人在线影院| 国产精品亚洲аv天堂网| 亚洲高清资源| 国产无遮挡一区二区三区毛片日本| 亚洲激情视频网站| 国产一区二区三区四区老人| 亚洲乱码视频| 亚洲日本一区二区| 久久国产主播精品| 亚洲欧美中文日韩v在线观看| 欧美电影在线观看完整版| 久久精品国亚洲| 欧美性开放视频| 亚洲国产一区二区三区在线播| 国产一区二区观看| 亚洲永久免费| 亚洲欧美大片| 欧美日韩午夜在线视频| 亚洲国产精品久久人人爱蜜臀| 极品少妇一区二区三区精品视频| 亚洲视频视频在线| 亚洲少妇在线| 欧美日韩高清在线播放| 亚洲国产一区二区三区青草影视 | 一本一本久久a久久精品综合麻豆 一本一本久久a久久精品牛牛影视 | 91久久线看在观草草青青| 永久555www成人免费| 性欧美超级视频| 性久久久久久久久| 国产伦理精品不卡| 午夜精品成人在线视频| 欧美一区二区三区婷婷月色 | 夜夜嗨av一区二区三区四区| 99av国产精品欲麻豆| 欧美freesex交免费视频| 欧美**字幕| 亚洲精品国产精品国自产观看浪潮| 久久婷婷影院| 欧美1区视频| 亚洲黄网站黄| 欧美精品一区二区三区在线播放| 亚洲日本中文| 亚洲影院色在线观看免费| 国产精品手机在线| 午夜视频一区在线观看| 久久久精品动漫| 亚洲第一黄网| 国产视频一区在线观看| 男人插女人欧美| 欧美国产综合视频| 99在线视频精品| 欧美午夜不卡影院在线观看完整版免费 | 久久综合给合久久狠狠色 | 久久福利精品| 国产婷婷97碰碰久久人人蜜臀| 欧美在线电影| 欧美国产视频在线| 中国成人亚色综合网站| 国产精品视频免费在线观看| 久久精品123| 亚洲国产视频直播| 亚洲欧美日产图| **网站欧美大片在线观看| 欧美国产一区视频在线观看| aa级大片欧美| 久久资源av| 亚洲伊人一本大道中文字幕| 国产一区视频观看| 欧美日韩精品久久| 久久精品综合网| 一本色道久久综合狠狠躁的推荐| 久久久综合视频| 亚洲午夜极品| 亚洲高清免费在线| 国产精品视频福利| 欧美国产精品| 欧美在线视频一区二区| 亚洲精品免费在线观看| 久久久夜夜夜| 午夜亚洲伦理| 亚洲免费成人av| 一区在线观看视频| 国产精品video| 男人的天堂亚洲| 性久久久久久久久久久久| 亚洲麻豆视频| 欧美顶级大胆免费视频| 欧美伊人久久大香线蕉综合69| 一本一道久久综合狠狠老精东影业| 国产一区二三区| 国产精品日韩欧美大师| 欧美精品自拍| 蜜臀久久久99精品久久久久久| 欧美一级淫片aaaaaaa视频| 亚洲免费高清视频| 亚洲精品字幕| 亚洲国产成人av在线| 蜜臀91精品一区二区三区| 欧美在线资源| 性欧美激情精品| 亚洲欧美亚洲|